자바의 Class에 대해 학습하세요.
public class ClassName{ // public class <ClassName>에서 <ClassName>은 소스파일 이름과 일치
// 소스파일에 1개만 가능
/*
객체간 역할과 책입, 협력에 따라 객체를 추상화...
멤버변수
생성자
메서드
*/
}
class ClassName2{ // 접근 제어자가 package-private(default)일 경우 public class 외 여러개 가능
// 컴파일 시 각 클래스파일이 따로 생성
}
public
, package-private
만 가능public
: 공개 API가 되며, 클라이언트를 위해 하위 호환 관리 필요package-private
: 해당 패키지 내에서만 사용하므로, 클라이언트와 관계 없이 얼마든 작업 가능장점
내부 클래스에서 외부 클래스에 쉽게 접근할 수 있다
외부 클래스 바깥으로는 내부 클래스를 감춰 캡슐화
public class OuterClass {
...
class InnerClass {
...
}
static class StaticNestedClass {
...
}
void method() {
class LocalInnerClass {
...
}
...
}
OuterClass anonymousClass = new OuterClass() {
...
};
}
/*
컴파일 시 생성 파일
OuterClass.class
OuterClass$1.class
OuterClass$1LocalInnerClass.class
OuterClass$InnerClass.class
OuterClass$StaticNestedClass.class
*/
static
제어자를 사용한 정적 중첩 클래스(Static Nested Class)와 비정적 중첩 클래스(Non-Static Nested Class)로 구분생성 방법
//정적 중첩 클래스
OuterClass.StaticNestedClass.***; // 방식으로 바로 접근 가능
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); //객체 생성 예
//내부 클래스
OuterClass outerObject = new OuterClass(); //OuterClass 객체를 생성해야 InnerClass 이용 가능
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
비정적 중첩 클래스는 다시 내부 클래스, 지역 클래스, 익명 클래스로 구분
지역 클래스: 다른 클래스의 인스턴스 메서드 내부에 선언
익명 클래스: 지역 클래스와 비슷하지만 일회성 객체를 반환하는 표현식으로 작성. 매개변수로도 가능
new *ParentClassName*(*constructorArgs*) {*members*}
new *InterfaceName*() {*members*}
NewClass newClass = new NewClass();
new
연산자는 힙 영역에 메모리를 할당하고, 그 주소를 반환한다NewClass
타입의 참조변수 newClass
를 선언하고 그 값을 new
연산자가 반환한 주소 값으로 초기화한 것이다이후 내용을 포함한 예제 코드와 이미지
public class MainClass {
public static void main(String[] args) {
NewClass newClass1 = new NewClass();
NewClass newClass2 = new NewClass();
newClass1.name_referenceType = "newClass1";
newClass2.name_referenceType = "newClass2";
newClass1.primitiveType = 1;
newClass2.primitiveType = 2;
newClass1.printInfo();
newClass2.printInfo();
}
}
class NewClass {
String name_referenceType;
int primitiveType;
public void printInfo() {
System.out.println("------" + this.name_referenceType + "------");
System.out.println(this.name_referenceType + " : " + this);
System.out.println(this.name_referenceType + ".name_referenceType : " + Integer.toHexString(name_referenceType.hashCode()));
System.out.println(this.name_referenceType + ".primitiveType : " + primitiveType);
}
}
/*
실행결과
------newClass1------
newClass1 : week5.NewClass@69222c14
newClass1.name_referenceType : c0b86379
newClass1.primitiveType : 1
------newClass2------
newClass2 : week5.NewClass@606d8acf
newClass2.name_referenceType : c0b8637a
newClass2.primitiveType : 2
/*
public int add(int x, int y){ //선언부: 접근제어 지시자, 반환타입, 메서드이름, 매개변수
//구현부: (지역변수), (구현식), return
}
접근제어 지시자: 메서드의 사용 범위 제한
반환타입: 메서드 수행 결과 반환할 타입
메서드 시그니처
return 반환값
을 포함. 단 멧서드의 반환타입이 viod
인 경우 컴파일러가 return;
자동으로 추가static
제어자를 사용해 객체 생성하지 않고 사용할 수 있는 메서드를 만들 수 있다클래스이름.메서드이름(매개변수)
식으로 호출static
키워드가 없는 메서드를 인스턴스 메서드라고 한다ClassName(){} //기본 생성자 형식
ClassName(int id, String name){
this.id = id;
this.name = name;
}
this(매개변수)
를 통해 여러 생성자 사용 가능