My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


Java (2) - Class (1) - Constructor, modifier

1) Class

Array에 대해서 배우려면 일단 클래스에 대해서 알고 있어야 할것같아서..

1-1. Class의 구성

[modifiers] class Class이름 {
    [modifiers] data_type attribute이름; // 멤버변수
    [modifier] Class이름(...){...}; // 생성자
    [modifier] return_type method이름 ([arguments]){...} // 멤버메서드
}
  • modifier : 접근제한자
  • 표면적으로 파이썬이랑 크게 다른 부분은 없어보입니다.

1-2. Constructor

  • 객체 초기화 작업을 수행함

  • 리턴값이 없어야함

    반드시 생성자가 존재해야함. (물론 적지 않으면 컴파일러가 자동으로 만들어줌.)

  • Constructor Overloading : 여러 생성자 선언 가능 (함수의 인자만 달라지면됨!)

1-3. this variable

  • this : 객체의 레퍼런스들 정보를 저장하기 위한 레퍼런스

    => this를 통해서 객체의 모든 정보에 접근가능하다!

  • Class Method 내에서 변수 우선순위

    1. Local variable
    2. this가 참조하고 있는 variable

    (실험)

    public static class Member {
        /* Error!
        java: non-static variable this cannot be referenced from a static context */
        int id; //  Error! java: cannot find symbol : variable id
        public Member(int id) {
            this.id = id;
        }
        public void getinfo(int id){
            System.out.println("Member id :" + id);
        }
        //overloading
        public void getinfo(){
            System.out.println("Member id :" + id);
        }
    }
    public static void main(String[] args){
        Member m = new Member(1);
        m.getinfo(2);
        m.getinfo();
    }
    
    Member id :2  // 로컬변수 참조
    Member id :1  // this변수 참조
    
    1. 항상 자바에서는 this.id의 주소에 참조하기 전에 this.id 를 미리 선언을 해야한다.

      클래스 내에서 선언을 하는거니까 그냥 int id 라고만 하면 된다.

      (파이썬에서는 그냥 되던데…)

    2. Class 앞에 static 키워드를 쓰지 않으니

      Non-static variable은 static context에 참조될수가 없다는 에러가 뜹니다.

      일단 static이라고 바꾸면 해결이 되는데, 무슨문제인지는 다음에 알아보기로..

1-4. Variable LifeCycle

  1. Member Variable : Heap 영역에 저장됨.
    • static :
      • class가 만들어질 때 자동으로 초기화됨,
      • 클래스 제거시 사라짐.
    • instance :
      • 객체 생성시에 자동으로 초기화됨.
      • 객체 제거시 사라짐.
  2. Local Variable : Stack 영역에 생성됨 (함수에 의존하므로)
    • method나 constructor가 수행 종료시 사라짐.

1-5. Modifier (제한자)

  1. Access Modifier (클래스 접근에 대한 제한)

    다른 클래스에서 이 클래스에 접근할 수 있는가?!

    • 종류 : private, (default), protected, public
    • 권한 : Same class -> Same package -> Subclass -> universe
  2. Usage Modifier (클래스 사용에 대한 제한)

    • static : 객체 생성없이 사용하고자 할 경우
    • final : 변경할 수 없음
    • abstract : 미완성

1-6. Static Modifier

  1. Static Variables

    • 멤버변수 정의 시에 static 키워드를 통해 정의함
    • 객체 생성 없이 사용할 수 있음.

    사용예시

    static변수를 Class2 안에서 선언

    public class Class2 {
        static int count = 0;
       
        public Class2(){
            count += 1;
        }
       
        public static void main(String[] args){
            // 클래스명.멤버변수 이렇게 사용가능함.
            System.out.println(Class2.count); // 0
       
            Class2 test1 = new Class2();
            Class2 test2 = new Class2();
            System.out.println(Class2.count); // 2 
        }
    }
    

    클래스를 생성할 때 마다 count라는 값이 늘고, 이 값이 공유되기 때문에 출력은 2가 된다.

  2. Static method

    • 객체 생성 없이 사용할 수 있음.
    • 그렇기 때문에 특정 객체의 정보(member variable, member method)를 활용할 수 없음

    에러예시)

    public class Class2 {
        static int count = 0;
        int var = 1;
        public Class2(){
            count += 1;
        }
       
        public static void main(String[] args){
            var++; // Class2 클래스의 인스턴스 변수를 활용할 수 없음.
        }
    }
    

    그래서 메인메서드 안에서 값을 정의하거나, static variable을 정의해서 쓰는것이 일반적입니다.

  3. Static block

    클래스가 메모리에 로딩된 후 자동으로 호출됨,

    Class3 객체가 여러개 생성되어도 static블록에 있는 문은 최초 단 한번만 실행된다.

    public class Class3 {
        static int count = 0;
        // static block
        static {
            System.out.println("Static initialize");
        }
        public static void main(String[] args){
            System.out.println("next...");
        }
    }
    
    Static initialize
    next...
    
  4. Static class : 이건 nested class에 대해서만 사용가능한데, nested class를 배우면서 알아보도록 합시다. (다음에..)

comments powered by Disqus