반응형

 

package com.test.oop;

//여기서 class AA 안에 있는 것은 다른 class 에 영향을 줄 수 없음. 캡슐 안에 들어있어. 캡슐화.

class AA {
    int a = 1;
    int b = 2;

    void aa(){ //return 할 데이터가 없을 때 void 쓰고 바로 method 작성.
        System.out.println("a = " + a + " / b = " +b);
    }
}

class BB {
    private int a = 3; //이름이 같아도 다른 class 이기 때문에 괜찮음. 
    int b = 4;
    static final int q = 100; //final 을 붙이면 기존 멤버변수가 상수가 됨.
    void bb(){
        System.out.println("a = " + a +  " / b = " + b);
    }

    public int getA(){ //이렇게 해서 private 인 a를 가져올 수 있음. return 되는 타입을 메소드인 getA() 앞에 적어둬야 함. void 는 return 되는 것이 없어서 안적은 것.
        return this.a; 
    }

    public void setA(int a){
        this.a = a;  //this.a는 클래스 내의 인스턴스 변수 a를 가르킴.
    }
}

class CC{
    static int c = 33; //class AA 와는 달리, static 을 앞에 붙이니, 여러개의 인스턴스를 생성시키더라도 static type 으로 선정된 멤버 변수는 여러 인스턴스에서도 동일한 메모리 공간을 차지함.
    int d = 60; 
    final int k = 4; //상수. 고정된 값으로 다른 데에서 k 를 5처럼 다른 값으로 바꿀 수 없음.
    void cc(){
        System.out.println("C = "+c + d);
        
    }
}

class DD{
    static int d = 88;
    static void dd(){ //static 을 method 인 void 앞에 적어주면, 이 method 에 사용되는 변수도 static 이 붙어야 함. 왜냐면 static 이 먼저 JVM 이 읽기 때문. 그럼 static 으로 안붙은 int 는 안올라가니까 그 static method 가 안돼.
        System.out.println("d = "+d);
    }    
}

public class Exam01 { //여러개의 class 가 있을 때, 파일명의 class 앞에 public 이 붙어야 함.
    public static void main(String[] args){ //main 앞에 static 이 붙어야 하는 이유 > JVM 이 읽기 시작할 때, static 이 붙은 method 들이 main method 와 같이 가장 먼저 올라옴.
        //static 이 붙으면 중요한 애니까 main method 와 같이 함께 메모리에 주소가 다 고정됨.

        
        AA aa1 = new AA(); //인스턴스화 : 클래스 AA 를 실제 실행에서 작동될 수 있도록 하는 것. AA 클래스를 aa1 이라는 인스턴스로 만들라고 시키는구나. 만들어야 겠네?!
        //프로세스가 작동을 할 떄, aa1이라는 인스턴스를 만들어야 겠구나, + AA() 는 AA 클레스의 형태를 가져와서 어떠한 메모리 공간에 aa1 이란 이름을 가진 인스턴스 객체를 생성시킴.

        AA aa2 = new AA(); //같은 클래스에서 왔지만, aa1과 전혀 다른 메모리 공간을 가짐. aa1과 관여 없음. 별도로 작동.

        //이렇게 하는 이유가 뭐야? 협업을 위해. 코드 중복 최소화를 위해. 공동모드. 예를 들어 쇼핑몰 만든다고 할 때 같은거 계속 반복해야 하잖아. 코드 중복 엄청나지잖아.

        
        aa1.aa();
        aa1.a = 10;
        aa1.b = 20;
        aa1.aa(); //여기선 a = 10, b = 20

        aa2.aa(); //aa1 과 간섭을 받지 않아서 원래대로, a=1, b=2
       
        BB obj2 = new BB(); //생성자에 의한 초기화 , 여기서 생성자는 BB() 이거임.
        obj2.bb();
        obj2.setA(1001);

        //obj2.a 는 가져올 수 없음. a 는 private 이기 때문. 가져오려면 getA() 같은 메소드를 직접 만들어야 함.

        System.out.println(obj2.getA());


        CC cc1 = new CC();
        CC cc2 = new CC();
        
        
        cc1.cc();
        cc2.cc();

        cc1.c = 44; // c는 cc1 과 cc2 모두에 바뀜. 왜냐하면 static int 이기 때문.
        cc1.d = 50; // d는 cc1 에서만 바뀜 일반 int 이기 때문.
        cc1.cc();
        cc2.cc();

        
        DD.dd(); //지금까지는 꼭 인스턴스 규칙에 의해서 앞에서 인스턴스화를 시켰어야 했음. 그런데 static method 가 생기니까 그냥 적어도 에러가 안남.

        //method 에 static 붙이면 인스턴스 객체를 안만들어도 됨.


    }
}
반응형

+ Recent posts