본문 바로가기

Contact English

【Java】 2강. 클래스

 

2강. 클래스(class)

 

추천글 : 【Java】 Java 목차 


1. 객체지향 프로그래밍 [본문]

2. class [본문]

3. call by value, call by reference [본문]

4. static [본문]

5. this [본문]

6. 생성자 [본문]


a. GitHub 


 

1. 객체지향 프로그래밍(OOP, object-oriented programming) [목차]

⑴ java 

① OOP design을 하도록 강제함

② java에서 모든 객체가 reference type 

⑵ C++

① OOP design이나 procedural design를 선택할 수 있음

② C++에서는 객체를 정의하면 실제 객체가 됨 : 주소가 아닌 실제 값이라는 의미 

 

 

2. 클래스(class) [목차]

⑴ 정의 : user나 API에 의해 정의된 데이터 타입. 객체의 청사진을 제공함

⑵ java class는 local variable과 달리 initialize가 자동으로 됨

 

 

3. call by value, call by reference [목차]

⑴ 예제

 

public class Main{
    public static void main(String[] args){
        int x = 1;
        Foo foo1 = new Foo(3);
        
        alterInt(x);    // call by value
        System.out.println(x); // 1

        alterFoo(foo1); // call by reference(1)
        System.out.println(foo1.value); // 3
        
        alterFooTwo(foo1);  // call by reference(2)
        System.out.println(foo1.value); // 6
    }

    public static void alterInt(int x){
        x ++;
    }
    public static void alterFoo(Foo foo){
        foo = new Foo(10);  // foo's pointer is updated, no longer indicating foo1 
    }
    public static void alterFooTwo(Foo foo){
        foo.value = 6;
    }
}

class Foo{
    int value;
    Foo(int x){
        value = x;
    }
}

 

⑵ java는 사실 전부 call by value인데, .attribute로 접근 시 call by reference의 효과를 내는 것에 불과함 

 

 

4. static [목차]

 

public class Main{
    public static void main(String[] args){
        A a = new A();
        System.out.println(a.a);    // 0
        System.out.println(A.a);    // 0
        A.f1();
        System.out.println(a.a);    // 1
        System.out.println(A.a);    // 1
        a.f2();
        System.out.println(a.a);    // 2
        System.out.println(A.a);    // 2
        // A.f3();  // error
    }
}

class A{
    static int a;
    static void f1(){
        a = 1;
    }
    static void f2(){
        a = 2;
    }
    void f3(){
        a = 3;
    }
}

 

⑴ 개요

① 정의 : 객체가 아니라 class에 속하도록 함

② 즉, static은 메모리를 공유하도록 하는 수식어

③ static method 및 attribute는 모든 인스턴스에서 선언되는 게 아니고 1회만 선언됨

static variable 

static으로 이미 선언된 변수는 데이터 영역에 저장되고 재선언 명령을 무시함 

static method 

① 예시

○ main 함수는 기본 메소드이기 때문에 java에서 반드시 static으로 선언돼야 함

○ 즉, 여러 인스턴스가 저마다 main 함수를 갖고 있을 필요가 없음

 Scanner System.in뿐만 아니라 files 등에서도 입력을 받기 때문에 Scanner method는 non-static (ref)

static method는 어떤 object를 지칭하는지 모르기 때문에 non-static method를 사용하는 행위가 금지됨

○ static method는 class 자체에 저장됨

○ 비슷한 이유로 static method는 static variable만을 연산할 수 있음 (ref) ]

static method에서 객체를 통해 instance method를 사용하는 것은 가능함

○ (참고) non-static method에서 static method를 사용하지 못할 이유는 없음

③ class 명으로 method에 접근하는 경우 반드시 그 method는 static으로 해야 함

○ static attribute, static method는 인스턴스로 접근할 수 있음

○ 이유 : 인스턴스에는 이미 class 정보가 포함되므로

⑷ 생성자는 항상 non-static으로 선언되고, static method와 별개의 문제임

① 즉, static method에서 non-static method를 사용하는 유일한 방법은 인스턴스로부터 호출하는 방법

 

 

5. this [목차]

 

class A{
    int x;
    public A(int input){
        x = input;
    }
    public A(){
        this(0);
    }   
}

 

⑴ this는 어떤 인스턴스가 method를 호출할 때, 그 method 내에서 그 인스턴스를 가리키기 위해서 사용됨

예시 1. 생성자로 쓸 때

예시 2. return this; 

예시 3. 그 인스턴스의 같은 이름의 변수와 구별하기 위해 사용

 

void METHOD(int x, int y){    ...this.x = x...    }

 

 그 밖에는 this를 쓰나 안 쓰나 크게 상관은 없음 

 

 

6. 생성자(constructor) [목차]

⑴ constructor는 return type이 없음

⑵ 생성자의 이름은 class의 이름과 동일함

⑶ 생성자가 꼭 하나일 필요는 없음

⑷ 생성자는 거의 대부분 public으로 선언됨 : 때때로 singleton architecture를 구현하기 위해 private으로 선언하기도 함

⑸ contructor에서 chaining constructor 호출은 가능한데 여러 constructor를 호출하는 건 불가능 

⑹ (참고constructor overriding은 허용되지 않음

  

입력: 2020.09.23 17:03