상속 관계의 하위 인스턴스를 생성하면 자동으로 class 내부에 this라는 변수와 super라는 변수를 생성한다.
이때 this라는 변수에는 new 키워드를 통해 생성한 인스턴스의 주소 값을 할당하고 super 변수에는 super()를 통해 인스턴스화한 상위 클래스의 주소값을 할당한다.
public A ( name) {
this.name = name;
}
this를 통해 변수명이 겹치더라도 자신의 필드나 메서드에 접근이 가능하고
public A ( name) {
super.name = name;
}
super를 통해 상위 인스턴스에 접근할 수 있다.
윈도우에서 파일을 관리하기 위해 폴더라는 시스템이 있듯이 Java에서는 class들을 관리하기 위해 package 시스템을 사용한다.
java package에서 package들은 .(dot)으로 구분한다.
간혹 java를 사용하다 보면 System.out.println()
과 같은 별도의 class import없이 사용 가능한 class들이 존재한다.
이는 java가 default package로 jre/rt.jar안의 java.lang을 import하여 가능하다.
다른 class를 사용하기 위해서는 import를 통해 class 위치를 알려주어야한다.
현실 세계에서 우리는 낮선 사람의 이름, 주소, 나이등의 정보는 알 수 없지만 친구의 이름, 주소, 나이는 알고있다.
현실 세계처럼 oop에서도 modifier 기술을 사용해 객체의 정보를 다른 객체들에게 공개하거나 숨길 수 있다.
1. private: 같은 클래스 내부에서만 접근할 수 있다.
2. default: 같은 패키지 내부에서만 접근할 수 있다.
3. protected: 같은 패키지 내부이거나 다른 패키지여도 상속관계면 접근할 수 있다.
4. public: 어디에서나 접근할 수 있다.
package inner;
public class Father{
private int privateModifier = "private";
String defualtModifier = "defualt";
protected String protectedModifier = "protected";
public String publicModifier = "public";
}
객체들을 모델링 할때 모든 객체들이 가지는 공통 속성이 존재 할 수있다.(남고의 학생들을 모델링 할때 학생들의 성별은 모두 남자)
이때 모든 객체들의 공통된 속성을 하나만 생성하고 객체들은 해당 속성을 공유하게 하여 공통 속성을 편리하게 관리 할 수 있다.
java에서는 이러한 기술을 static 키워드를 통해 제공한다.
public class StaticTest{
int nonStaticField;
static int staticField;
public int getNonStaticField() {
return nonStaticField;
}
public static int getStaticField() {
return staticField;
}
public static void main(String[] args) {
StaticTest test = new StaticTest();
System.out.println(test.nonStaticField); //인스턴스 생성을 통해 필드 호출 가능
System.out.println(test.getStaticField()); //인스턴스 생성을 통해 메서드 호출 가능
System.out.println(StaticTest.staticField); //별도의 인스턴스 생성 없이 클래스명으로 필드 호출 가능
System.out.println(StaticTest.getStaticField()); //별도의 인스턴스 생성 없이 클래스명으로 메서드 호출 가능
}
}
클래스를 등록하면서 클래스 내부 static 키워드가 붙어있는 필드나 메서드들을 static 영역에 등록한다.
아직 인스턴스화를 통해 생성 된 것이 아니기에 static 영역에서 필드나 메서드의 식별자는 변수명이 아닌 class의 이름으로 등록된다.
식별자가 class 이름으로 등록되어 별도의 인스턴스화 없이 클래스 이름만으로 호출할 수 있다.
이렇게 생성된 static 필드와 메서드는 새로운 인스턴스를 생성하더라도 새로 생성하지 않고 기존의 static 영역에 있는 필드와 메서드들을 공유하여 메모리 낭비를 막아준다.
이러한 실행방식은 인스턴스를 생성한 후 호출하는 것이 아니기에 field와 무관, 즉 상태와 무관한 행위를 한다.
현실세계에서 주어진 속성이나 행동만을 해야 되는 일이 발생한다. 이를 구현하기 위한 oopl 기술이 final 키워드이다.
1. final final = "abc"; //필드 앞에 붙으면 해당 필드 값을 변경할 수 없다
2. final class finalClass{} //클래스 앞에 붙은 경우 해당 클래스는 상속받을 수 없다
3. public final finalMethod() {} //메서도 앞에 붙은 경우 해당 클래스는 오버라이딩을 할 수 없다
지금까지 배운 oopl내용으로 System.out.println()
을 정리하면 아래와 같다.
System이라는 클래스가 존재하고 그 class의 out field를 .으로 접근한다. new 키워드를 통해 인스턴스를 생성하고 접근하는 것이 아닌 class 명으로 접근하기에
해당 out field는 static field이다. out field의 타입은 printStream class이기에 해당 class의 메서드를 호출할 수 있다(a.charAt(0)처럼)
변수명에 .을 붙혀 println() 메서드를 호출한 것으로 보아 println()은 인스턴스 메서드이고 해당 메서드를 통해 콘솔 창에 abc를 출력한다 .