[클래스]

클래스란 무엇인가? 

클래스란, 개체를 생성하기 위한 틀을 의미한다. 개체는 클래스를 통하여 생성된다. 

클래스는 동작과 상태를 갖고 있는데, 이는 상태와 동작이 분리된 과거의 절차지향 프로그래밍과는 다른 시각에서 접근하였다. 정해진 절차를 수행하는 것과 같은 알고리즘과는 다르게 프로그래머의 주관이 많이 개입되는 영역이다. 개체를 어떻게 보는지에 따라 같은 목표를 달성하기 위한 동작과 상태를 다르게 작성할 수 있다. 

 

클래스는 어떻게 정의하는가? 

1) 상태(멤버변수)는 무엇이며 어떻게 정의하는가? 

멤버변수는 개체의 상태를 나타내며 정의방법은 아래와 같다.

private int age; // <접근제어자> <자료형> <변수명> 으로 구성

 

2) 동작(메소드)는 무엇이며 어떻게 정의하는가?

메소드는 개체의 동작을 나타내며 정의방법은 아래와 같다.

public int getAge(); // <접근제어자> <반환할 자료형> <메소드명> (파라미터) 으로 구성

 

3) 생성자는 무엇이며 어떻게 정의하는가? 

생성자는 개체를 생성하는 역할을 수행하며 정의 방법은 아래와 같다. 

// 클래스 정의 생략
public Person(int age, String name){ //<접근제어자> <클래스명> (파라미터) {초기화코드} 로 구성
  this.age = age;
  this.name = name;
}

이때, 접근제어자는 개체 생성시 차이가 존재하며 private인 경우 디자인패턴에서, 싱글턴 패턴이라는 형식으로 사용되기도 한다. 

접근제어자 별 차이는 아래와 같다. 

// 외부에서 개체 생성이 불가능
private Person(){
  
}

// 동일 패키지내 or 해당 클래스를 상속받은 경우에 개체 생성가능
protected Person(int age, String name){
  this.age = age;
  this.name = name;
}

// 동일 패키지에서 개체 생성가능
Person(String name){
  this.name = name;
}

// 어디에서나 개체 생성가능
public Person(int age){
  this.age = age;
}

 

4) this 키워드는 무엇인가?

this 예약어는 보통 아래와 같이 사용하는는데 그 목적은 컴파일러 입장에서 생성자에 의해  shadowed 된 멤버변수와 지역변수를 구분하기 위해 주로 사용한다고 한다. 위의 설명은 설명일뿐 실제로 가장 중요한 것은 개체 그 자신이라는 것이다. 위의 링크에서는 this()도 설명하는데, 이 경우 다른 생성자를 호출하기 위한 용도로 사용된다.

public Person(int age){
  this.age = age;
  System.out.println(this); // 개체의 인스턴스 주소를 출력함을 확인할 수 있음. 즉 개체 그 자신이다. 
}

[docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html]

[개체]

개체는 어떻게 만드는가? ( new 키워드 이해하기)

오라클 문서에서는 new 키워드는 개체를 생성하고, 생성자를 호출한다라고 기술되어 있다.

[docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html]

 

위의 Person 클래스를 개체로 만들어보면, AppClassLoader(ClassLoader).loadClass(String) 를 수행하고, AppClassLoader.loadClass(String, boolean) 를 수행하였다. 

public static void main(String[] args) {
  // Stack 의 지역변수 할당
  Person p;

  // Heap 에 개체 생성 및 이를 지역변수에 할당 
  p = new Person();
}
	

즉 정리하자면, 

1) Person.class 를 로딩하고 -> 이때 한번 적재된 클래스인 경우, AppClassLoader 는 호출되지 않음.

2) 생성자를 통해 개체를 생성함을 확인할 수 있었다. 

 

+ Recent posts