본문 바로가기

자바/정리

(JAVA)클래스와 인스턴스

우리는 앞선 설명에서 메서드에 대해서 알아보았다. Math.floor()에서 Math가 클래스고 floor()가 Math가 가지고 있는 하나의 기능이다. 그렇다 클래스는 하나의 큰 그룹이자 설계도이다. 우선 코드를 하나 살펴보자

 

public class Cexemple {


    public static void avg(int left, int right) {
        System.out.println((left + right) / 2);
    }

    public static void sum(int left, int right) {
        System.out.println(left + right);
    }


    public static void main(String[] args) {

int left, right;
        left = 10;
        right = 20;
        sum(left, right);
        avg(left, right);

        left = 20;
        right = 40;
        sum(left, right);
        avg(left, right);
    }

}

 

30
15
60
30

 

라는 결과가 나온다. 메서드에 값을 입력하는 설명은 https://acid7937.tistory.com/12 저번 포스트에서 보여주었다.

 

이것이 최종이라 생각했지만 이러한 코드도 규모가 커질수록 문제가 될수 있는 이유가 있다. 그 이유는...

 

수만줄이 되는 코드들이 있는데 예시로 보이는 left의 값을 까먹고 나중에 다른 사람이 떠나다로 쓸수도 있는것이고 right 는 권리 혹은 옳다 라고 쓸수도 있는것이다. 뭐 권리금 준다고 right 에다가 50,000 넣으면 안될것 아닌가...

 

그래서 이를 방지하기 위해 우리가 쓸수 있는게 인스턴스 라는 개념이다. 우선 예제를 살펴보자

 

public class Calculater {

int left, right;

    public void enter(int left, int right) {
        this.left = left;
        this.right = right;
    }

    public void avg() { //static 이 안보인다 이유는 클래스 변수에서만 쓸수 있기 때문인데 추후 설명할 예정
        System.out.println((this.left + this.right) / 2);
    }

    public void sum() {
        System.out.println(this.left + this.right);
    }

    public static void main(String[] args) {

        Calculater c1 = new Calculater();
        c1.enter(10,20);
        c1.sum();
        c1.avg();

        Calculater c2 = new Calculater();
        c2.enter(20,40);
        c2.sum();
        c2.avg();
        
    }

}

 

같은 결과가 나오지만 코드만 봐서는 이해가 잘 안가는게 정상이다. 코드에서 새롭게 보이는것이 무엇이 있는가?

 

갑자기 this가 보이고, Calculater c1 = new Calculater(); 도 있고, void 앞에 Static 도 안보인다. 설명하겠다.

 

Main을 보자 

 

Calculater c1 = new Calculater();  // Calculater 클래스를 가져와서 new를 붙이면 새로운 인스턴스로 변하고 
// c1이라는 객체를 만들어 저장한 것이다. (c1 객체만 내가 원하는대로 설정가능)

c1.enter(10,20);    //  enter 매서드를 가져오고 내가 10과 20의 값을 넣었다.
c1.sum();        // sum의 기능을 사용할 것이다.
c1.avg();        // avg의 기능을 사용할 것이다.

 

이것이 "인스턴스 한개의 덩이리다." 클래스를 깔끔하게 복사해서 내가원하는 값만 뽑아 쓰고 값을 변경할수 있다. (avg 쓰기 싫으면 지우면 되잖음)

 

그리고 다른 값으로 바뀌게 되어도 유연하게 Calculater c2 = new Calculater(); 를 선언하여 원하는 값을 넣으면 그만이다.

 

이렇게 보니깐 별거 아닌것 처럼 보여도 몇천줄 짜리 하게되면 이거 아니면 한숨 나올것이다.

 

다음으로 This를 보겠다. 우선 값을 입력 받는 c1.enter(10,20); 을 보면 

 

    public void enter(int left, int right) {       //  10과 20을 여기 매개변수에 넣지 않았는가?
        this.left = left;                                     // this 가 튀어 나오는데 이게 위에 있는 전역변수로 바꾸라는 말이다.
        this.right = right;                                 // 이것도 마찬가지고 this.right = 20;
    }

 

또 한숨 나오겠지 전역변수라니 뭔소리야?

 

맨 위에 보면 int left, right; 가 선봉에서 비바람 맞는게 보일것이다. 그렇다 int left, right 를 클래스 바로 아래에 써버리면 전체 다른 메서드에서 사용가능한 변수가 되는 것이다 이게 전역 변수이다.

 

의문이 들수도 있을것이다 첫번째 코드에서는 this 그런게 없어도 잘 돌아가는데? main 안에 있는 int 지우고 위로 올려서 전역변수로 만들어 보자 물론 안돌아가 간다 ㅎㅎㅎ. (그러니깐 this로 해결하면 깔끔하잖음 시작글 읽어보면 main 안에 지역변수 int 값 right에 누가 50000 넣고 3000 넣고 이런 문제 때문에 지금 까지 이걸 한거다.)

 

글이 너무 길어져서 Static 개념은 다른 게시글에서 자세히 설명하겠다.

'자바 > 정리' 카테고리의 다른 글

(JAVA)전역변수 지역변수  (0) 2022.11.10
(JAVA)클래스 맴버, 인스턴스 맴버.  (0) 2022.11.09
(JAVA)메서드  (0) 2022.11.08
(JAVA)삼항 연산자  (0) 2022.11.08
(JAVA)배열 내림차순 오름차순  (0) 2022.11.07