CH06. 클래스
-
객체 지향 프로그래밍
a. 객체?
-
물리적으로 존재하거나, 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다.
-
객체는 속성과 동작으로 구성되어 있다.
b. 객체 지향 프로그래밍의 특징
-
캡슐화
-
객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말한다.
-
접근제한자를 이용하여 캡슐화한다.
-
-
상속
- 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해준다.
-
다형성
- 같은 타입이지만 실행결과가 다양한 객체를 이용할 수 있는 성질을 말한다.
-
-
객체와 클래스
-
클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
-
인스턴스: 클래스로부터 만들어진 객체
-
인스턴스화: 클래스로부터 객체를 만드는 과정
-
-
객체 생성과 클래스 변수
-
new는 클래스로부터 객체를 생성시키는 연산자이다.
-
new 연산자로 생성된 객체는 메모리 힙(heap)영역에 생성된다.
-
-
클래스의 구성 멤버
-
클래스에는 객체가 가져야 할 구성 멤버가 선언된다.
-
필드
- 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.
- 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.
-
생성자
-
new 연산자로 호출되는 특별한 중괄호 {} 블록이다.
-
필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 한다.
-
클래스 이름으로 되어 있고 리턴 타입이 없다.
-
new 연산자에 의해 생성자가 성공적으로 실행되면 힙(heap) 영역에 객체가 생성되고 객체의 주소가 리턴된다.
-
클래스 내부에 생성자 선언을 생략했다면, 컴파일러는 중괄호 {} 블록 내용이 비어있는 기본 생성자(Default Constructor)를 바이트 코드에 자동으로 추가시킨다.
-
생성자 오버로딩
public class ConstructorOverloadingExample { String str; int a, b, c; public ConstructorOverloadingExample() { } public ConstructorOverloadingExample(String str) { this.str = str; } public ConstructorOverloadingExample(int a, int b) { this.a = a; this.b = b; } public ConstructorOverloadingExample(int a, int b, int c) { this(a, b); // 다른 생성자 호출 this.c = c; } public static void main(String[] args) { ConstructorOverloadingExample c1 = new ConstructorOverloadingExample(); ConstructorOverloadingExample c2 = new ConstructorOverloadingExample("안녕"); ConstructorOverloadingExample c3 = new ConstructorOverloadingExample(1, 2); ConstructorOverloadingExample c4 = new ConstructorOverloadingExample(1, 2, 3); System.out.println(c1); System.out.println(c2); System.out.println(c3); System.out.println(c4); } }
-
-
메소드
-
객체의 동작에 해당하는 중괄호 {} 블록을 말한다.
-
시그니처(Signature): 리턴 타입, 메소드, 매개변수선언
-
-
-
인스턴스 멤버와 this
- 인스턴스 멤버: 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말한다.
-
정적멤버와 static
-
정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
-
클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.
-
static 변수
-
객체 생성없이 사용할 수 있다.
-
instance한 객체들 간의 공통변수로 사용
-
-
static 메소드
-
객체 생성없이 사용가능하다.
-
static 변수만 사용가능하다.
-
일반 변수와 메소드는 사용할 수 없다.
-
this, super을 사용할 수 없다.
-
overriding을 사용할 수 없다.
-
-
싱글톤
public class SingletonExample { public static void main(String[] args) { Block b1 = Block.getInstance(); Block b2 = Block.getInstance(); System.out.println(b1==b2); } } class Block { private static Block blockInstance; private Block() { blockInstance = new Block(); } static Block getInstance() { return blockInstance; } }
-
-
final 필드와 상수
final 필드
초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다는 것이다.
static final (상수)
객체마다 저장되지 않고, 클래스에만 포함된다. 그리고 한 번 초기값이 저장되면 변경할 수 없다.
-
접근제한자
접근제한자 적용대상 접근할 수 없는 클래스 public 클래스, 필드, 생성자, 메소드 없음 protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스 default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스 private 필드, 생성자, 메소드 모든 외부 클래스 -
Getter와 Setter
public class SingletonExample { public static void main(String[] args) { Block b1 = new Block(); System.out.println(b1.getBlockName()); System.out.println(b1.getBlockNum()); b1.setBlockName("블록1-1"); System.out.println(b1.getBlockName()); } } class Block { private int blockNum; private String blockName; public Block() { blockName = "블록1"; blockNum = 1; } public int getBlockNum() { return blockNum; } public void setBlockNum(int blockNum) { this.blockNum = blockNum; } public String getBlockName() { return blockName; } public void setBlockName(String blockName) { this.blockName = blockName; } }
-
어노테이션
-
어노테이션은 메타데이터라고 볼 수 있다.
-
메타데이터란 어플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다.
-
어노테이션 적용 대상
Element Type 열거 상수 적용 대상 TYPE 클래스, 인터페이스, 열거 타입 ANNOTATION_TYPE 어노테이션 FIELD 필드 CONSTRUCTOR 생성자 METHOD 메소드 LOCAL_VARIABLE 로컬변수 PACKAGE 메서드 -
어노테이션 유지 정책
Retention Policy 열거 상수 설명 SOURCE 소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다. CLASS 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다. RUNTIME 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 있다.
-