객체지향 프로그래밍의 5가지 설계 원칙, SOLID
객체지향 5원칙
객체지향 설계5대 원칙이라 부르는데 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)을 말하고 앞자를 따서 SOILD 원칙이라고 부른다.
[ 단일 책임의 원칙(SRP, Single Responsibility Principle) ]
모든 클래스는 각각 하나의 책임만 가져야 한다. 클래스는 그 책임을 완전히 캡슐화해야 함을 말한다.
- 사칙연산 함수를 가지고 있는 계산 클래스가 있다고 치자. 이 상태의 계산 클래스는 오직 사칙연산 기능만을 책임진다. 이 클래스를 수정한다고 한다면 그 이유는 사직연산 함수와 관련된 문제일 뿐이다.
[ 개방 폐쇄 원칙 (Open-Closed Principle, OCP) ]
확장에는 열려있고 수정에는 닫혀있는. 기존의 코드를 변경하지 않으면서( Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다는 원칙을 말한다.
- 캐릭터를 하나 생성한다고 할때, 각각의 캐릭터가 움직임이 다를 경우 움직임의 패턴 구현을 하위 클래스에 맡긴다면 캐릭터 클래스의 수정은 필요가없고(Closed) 움직임의 패턴만 재정의 하면 된다.(Open)
[ 리스코프 치환 원칙 (Liskov Substitution Principle, LSP) ]
자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다.
자식클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야 LSP를 만족한다.
[ 인터페이스 분리 원칙 (Interface segregation principle, ISP) ]
한 클래스는 자신이 사용하지않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다.
[ 의존 역전 원칙 (Dependency Inversion Principle, DIP) ]
의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다. 한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다.
객체지향 프로그래밍이란?
부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립하여 완성된 프로그램을 만드는 기법을 객체지향 프로그래밍(OOP: Object Oriented Programming)이라고 한다.
객체란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다. 표로 예를 들어보면
클래스
|
객체
|
|
tv설계도
|
tv
|
|
붕어빵기계
|
붕어빵
|
객체 모델링이란?
현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정이다.
객체의 관계란?
객체는 대부분 다른 객체와 관계를 맺고 있다. 관계의 종류는 집합 관계, 사용 관계, 상속 관계가 있다.
집합 관계
부품을 조합해서 완성품이 되는 관계이다.
머리, 팔, 몸통, 다리를 합치면 인체가 된다.
사용 관계
한 객체가 다른 객체와 상호작용하는 것을 말한다.
사람은 라이터를 사용한다.
라이터와 사람은 사용 관계이다.
사람은 필요할 때 라이터를 켠다 등의 메소드를 호출한다.
상속 관계
상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계를 말한다. 일반적으로 상위 객체는 종류(인터페이스)이며, 하위 객체는 구체적인 사물(구현체)에 해당한다.
객체지향 프로그래밍(OOP)은 만들고자하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법이다.
객체지향 프로그래밍의 특징
- 캡슐화
- 상속
- 다형성
- 추상화
캡슐화
객체의 내부 구조를 알지 못하게하고, 객체가 제공하는 필드와 메소드만 이용할 수 있게 하는 것이다. 외부의 잘못된 사용을 예방한다.
상속
상위 객체가 필드와 메소드를 하위 객체에게 물려주는 것을 말한다. 공통적인 부분을 추상화하여 상위 객체로 만들면, 하위 객체에서는 반복된 코드가 줄어든다. 또 코드를 변경 시에도 상위의 코드만 변경하면 하위에 자동으로 적용되어 용이하다.
다형성
같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 하나의 인터페이스로 다양한 구현체를 만드는 것이 이에 해당한다. 같은 인터페이스 타입이라면 어느 구현체로든 교체가 가능하다.
추상화
추상이라는 용어의 사전적 의미를 보면 “사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”이라 정의하고 있습니다. 여기서 핵심이 되는 개념은 “공통성과 본질을 모아 추출”한다는 것입니다.
new 연산자
new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 주소를 리턴한다.
객체와 클래스
클래스는 객체의 설계도이며, 생성자로 객체를 생성하면 인스턴스가 된다.
클래스 선언
- 하나 이상의 문자로 이루어져야 한다.
- 첫번째 글자는 숫자가 올 수 없다.
- $, _ 외의 특수문자를 사용할 수 없다.
- 자바 키워드는 사용할 수 없다.
- ex) int, for 등...
객체 생성과 클래스 변수
클래스를 선언한 다음, 컴파일을 했다면 객체를 생성할 설계도가 만들어진 셈이다.
new 클래스();
클래스 변수;
변수 = new 클래스();
클래스 구성 멤머
- 필드 (Field)
- 객체의 데이터를 저장
- 생성자 (Constructor)
- 객체 생성 시 초기화 역할 담당
- 메소드 (Method)
- 객체의 동작에 해당하는 실행 블록
필드
필드는 객체의 고유 데이터, 부품객체, 상태 정보를 저장하는 곳이다.
선언 형태는 변수와 비슷하지만, 필드변수라고 부르지 않는다.
변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸된다.
하지만 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.
생성자
생성자는 new 연산자로 호출되는 중괄호 {} 블록이다.
생성자의 역활은 객체 생성시 초기화를 담당
필드를 초기화 하거나, 메소드를 호출해서 객체를 사용할 준비를 한다. 생성자 메소드와 비슷하게 생겼지만,
클래스 이름으로 되어있고 리턴타입은 없다.
메소드
메소드는 객체의 동작에 해당하는 중괄호{} 블록을 말한다.
중괄호 블록은 이름을 가지고 있는데 이것이 메소드 이름이다.
필드
필드(Field)는 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.
자동차를 예로 들었을때
public class Car {
//고유 데이터
String 회사;
String 모델;
String 색;
int 최고속도;
//상태
int 현재 속도;
int 엔진 회전수;
//부품
Body 차체;
Engine 엔진;
Tire 타이어;
}

필드 선언은 클래스 중괄호{} 블록 어디서든 존재할 수 있다. 생성자 선언과 메소드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다.
- byte: 0
- char: \0000 (빈 공백)
- short: 0
- int: 0
- long: 0L
- float: 0.0F
- double: 0.0
- boolean: false
- 배열,클래스, 인터페이스: null
필드사용
필드를 사용한다는 것은 필드값을 읽고, 변경하는 작업을 말한다.

생성자
생성자는 new 연산자와 같이 사용되어 클래스로부토 갹채를 생성할 때 호출되어
객체의 초기화를 담당한다.
기본생성자
- 클래스 내부에 생성자 선언을 생략하면, 자바는 아무런 내용이 없는 기본 생성자를 바이트 코드에 자동 추가시킨다.
- 클래스가 public으로 선언되면 기본 생성자에도 public이 붙는다.
- 클래스가 public이 아니라면, 기본 생성자도 public이 아니다.
생성자 선언
생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일하다.
필드초기화
- 필드를 만들면서 고정된 값을 줄 수 있다.
- 생성자에서도 가능하다.

생성자 오버로딩
- 매개변수의 타입, 갯수 등이 다른 생성자를 여러개 만드는 것이다.
- 매개변수의 타입, 갯수, 선언된 순서가 같은 경우 오버로딩으로 볼 수 없다.
다른생성자 호출
- 생성자에서 다른 생성자를 호출할 때는 this()를 이용하면 된다.
- this()는 생성자 첫째 줄에서만 사용 가능하다.
메소드
메소드는 객체의 동작에 해당하는 중괄호{} 블록을 말한다. 중괄호 블록은 이름을 가지고 있는데, 이것이 메소드명이다. 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다. 외부로부터 매개값을 받을 수 있고, 실행 후 어떤 값을 리턴할 수도 있다.
메소드 선언
메소드 선언은 선언부(리턴타입, 메소드이름, 매개변수선언)와 실행 블록으로 구성된다. 메소드 선언부를 메소드 시그너처(signature)라고도 한다.

리턴타입
리턴 타입은 메소드가 실행 후 리턴하는 값의 타입을 말한다.
메소드는 리턴값이 있을 수도 있고 없을 수도 있다. 메소드가 실행 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴값이 있어야 한다.
메소드 이름
- 숫자로 시작하면 안된다.
- $와 _를 제외한 특수문자 사용 불가능하다.
- 메소드명은 camelCase로 작성한다.
매개 변수 선언
매개 변수의 수를 모를 경우
...을 쓸 수 있다.
매개변수가 배열 형태로 들어온다.
public int sum(int ... values) {
int result = 0;
for(int value : values) {
result += value;
}
return result;
}
리턴(return)문
리턴값이 있는 메소드
메소드 선언에 리턴이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 한다. 만약 리턴문이 없다면 컴파일 오류가 발생한다. 리턴문이 실행되면 메소드는 즉시 종료된다.
리턴값이 없는 메소드
메소드 실행을 강제 종료시킨다.
메소드 호출
메소드는 클래스 내'외부의 호출에 의해 실행된다. 클래스 내부의 다른 메소드에서 호출할 경우에는 단순한 메소드 이름으로 호출하면 되지만, 클래스 외부에서 호출할 경우에는 우선 클래스로부터 개개체를 생성한뒤, 참조 변수를 이용해서 메소드를 호출해야한다. 그 이유는 객체가 존재해야 메소드도 존재하기 때문이다.
객체 내부에서 호출
클래스 내부에서 다른 메소드를 호출한 경우애는 다음과 같은 형태로 작성하면 된다.
메소드가 매개변수를 가지고 있을때에는 매개 변수의 타입과 수에 맞게 매개값을 제공한다.
메소드(매개값, ...);
객체 외부에서 호출
외부 클래스에서 메소드를 호출하려면 우선 다음과 같이 클래스로부터 객체를 생성해야 한다. 메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문이다 .
클래스 참조변수 = new 클래스(매개값,...);
메소드 오버로딩
이름이 같은 메소드인데, 매개변수 타입, 개수, 순서 중 하나라도 다른 것을 만들면 메소드 오버로딩이라 한다.
인스턴스 멤버와 this
정적 멤버와 static
정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로, 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리되므로, 클래스의 로딩이 끝나면 바로 사용할 수 있다.
메소드 영역에 정적 필드와 정적 메소드가 저장된다
정적 멤버와 Static
정적은 '고정된'이란 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
정적 멤버 선언

정적 필드와 정적 메소드를 선언하는 방법은 필드와 메소드 선언시 static 키워드를 추가적으로 붙이면 된다.
정적 멤버 사용
클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데,
클래스 이름과 함께 도트(.)연산자로 접근한다
클래스.필드;
클래스.메소드(메개값, ...);
정적 초기화 블록
정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 보통이다.
static double pi = 3.14159;
클래스 내부에 위와 같은 static 블록을 선언하여 정적 변수 등의 초기화 등이 가능하다.
정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행된다.
정적 메소드와 블록 선언 시 주의할 점
정적 메소드 내부나 정적 블록 내부에서는 인스턴스 필드가 사용 불가능하니 유의하자.
this 키워드도 사용 불가능하다.
객체가 없어도 실행된다는 특징 때문이다.
싱글톤
- 싱글톤은 정적 필드를 이용한 패턴이다.
- 클래스 내부에 private static으로 자신의 타입을 가진 필드를 하나 생성하고, 자신을 인스턴스화한다.
- 외부에서 접근할 때는 정적 메소드인 .getInstance() 메소드를 이용한다.
- 생성자를 이용해서 생성할 수 없게 private으로 막아둬야 한다.
- 프로그램에서 오직 하나만 존재하는 객체임이 보장된다.
final 필드와 상수
final 필드
- final 필드는 초기 값이 저장되면 프로그램 실행 도중에 수정이 불가능하다.
- 초기 값은 선언 시 혹은 생성자에서 줄 수 있다.
- 생성자에서 까지도 값을 결정하지 않으면 컴파일 에러가 난다.
상수 (static final)
- final 필드는 객체마다 저장되지만, 상수는 객체마다 저장될 필요성이 없는 공통적인 값이다. 그래서 static과 final을 동시에 써서 정의한다.
- static final 필드는 클래스에만 포함되며, 초기값이 저장되면 변경할 수 없다.
- static final 필드의 초기화 과정이 복잡하다면 static 블록에서 초기화해준다.
- 네이밍은 모두 대문자로 하며 단어마다 _로 구분한다.
static final double PI = 3.14159;
final 타입 필드 [= 초기값];
상수
일반적으로 불변의 값을 상수라고 부른다 .
ex) 원주율 파이나 지구의 무게 및 둘레 등등
이런 불변의 값을 저장하는 필드를 자바에서는 상수라고 한다.
static final 타입 상수 [=초기값];
패키지( package )
자바에서 패키지(package)란 클래스와 인터페이스의 집합을 의미합니다.
클래스의 전체 이름은 "패키지명+클래스명"
상,하위로 구분되어 있다면 도트 .를 사용한다 // 상위패키지.하위클래스.클래스
패키지 선언
패키지는 클래스를 컴파일하는 과정에서 자동적으로 생성되는 폴더이다.
package 패키지이름;
패키지 이름은
숫자로 시작해서 안되고, _, $, 를 제외한 특수문자를 사용해서는 안된다.
java에서 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해서는 안된다.
모두 소문자로 작성하는것이 관례이다.
이름 없는 패키지(unnamed package)
자바의 모든 클래스는 반드시 하나 이상의 패키지에 포함되어야 합니다.
import 문
선언한 패키지에 속한 클래스를 다른 파일에서 사용하기 위해서는 클래스 이름 앞에 패키지의 경로까지 포함한 풀 네임을 명시해 사용해야 합니다.
import 문을 사용하면 다른 패키지에 속한 클래스를 패키지 이름을 제외한 클래스 이름만으로 사용할 수 있게 됩니다.
1. import 패키지이름.클래스이름;
2. import 패키지이름.*;
package kr.mycompany;
public class Ex01{
Mycompany mc = new Mycompany();
// 타입 필드명 객체생성
}
접근 제어자
접근 제어자(access modifier)
객체 지향에서 정보 은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념입니다.
그렇게 함으로써 사용자는 언제나 최소한의 정보만으로 프로그램을 손쉽게 사용할 수 있게 됩니다.
자바에서는 이러한 정보 은닉을 위해 접근 제어자(access modifier)라는 기능을 제공하고 있습니다.
접근 제어자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있습니다.
자바에서는 다음과 같은 네 가지의 접근 제어자를 제공합니다.
1.public
2. private
3. default
4. protected
접근제한
|
적용대상
|
접근할 수 없는 클래스
|
|
public
|
클래스, 필드, 생성자, 메소드
|
없음
|
|
private
|
필드,생성자,메소드
|
모든 외부 클래스
|
|
default
|
클래스,필드,생성자,메소드
|
다른 패키지에 소속된 클래스
|
|
protected
|
필드,생성자,메소드
|
자식 클래스가 아닌 다른 패키지에 소속된 클래스
|
public
접근제어자가 public으로 설정되었다면 public 접근제어자가 붙은 변수, 메서드는 어떤 클래스에서라도 접근이 가능하다.
package kr.mycompany;
public class H2 {
protected String lastname = "park";
public String info = "this is public message.";
}
private
접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능하다.
public class H2 {
private String secret;
private String getSecret() {
return this.secret;
}
}
위 예제의 secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능하다.
default
접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메서드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능하다.
package kr.mycompany; // 패키지가 동일하다.
public class H2 {
String lastname = "kim"; // lastname은 default 접근제어자로 설정된다.
}
protected
접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.
package kr.h2.my; // 패키지가 서로 다르다.
public class H2 {
protected String lastname = "park";
}
생성자의 접근제한
- public, protected, default, private
public: 모든 패키지에서 아무런 제한 없이 생성자를 호출 가능
생성자가 public 접근 제한을 가진다면 클래스도 public 접근 제한을 가져야 한다. 클래스가 default 접근 제한을 가지면 클래스 사용이 같은 패키지로 한정되므로 같은 패키지에서만 생성자를 호출할 수 있기 때문이다.
protected: 같은 패키지에 속하는 클래스 or 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자를 호출 가능
default: 같은 패키지에서만 생성자를 호출 가능
private: 생성자를 호출하지 못하도록 제한
클래스 외부에서 new 연산자로 객체를 만들 수 없다. 오로지 클래스 내부에서만 생성자를 호출하여 객체를 만들 수 있다. 프로그램에서 클래스의 객체를 단 하나만 갖는 싱글톤 패턴 등에 사용될 수 있다.
필드와 메소드의 접근 제한
필드와 메소드를 선언할 때 해당 필드와 메소드를 클래스 내부에서만 사용할 것인지, 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야 합니다. 이것은 필드와 메소드가 어떤 접근 제한을 갖느냐에 따라 결정됩니다. 필드와 메소드는 다음과 같이 public, protected, default, private 접근 제한을 가질 수 있습니다.
- public 접근 제한: public 접근 제한은 모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용할 수 있도록 해줍니다.
- protected 접근 제한: protected 접근 제한은 default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있도록 합니다. 차이점으로 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있습니다.
- default 접근 제한: 필드와 메소드를 선언할 때 접근 제한자를 생략하면 default 접근 제한을 가집니다. default 접근 제한은 같은 패키지에서는 아무런 제한 없이 필드와 메소드를 사용할 수 있으나 다른 패키지에서는 필드와 메소드를 사용할 수 없도록 합니다.
- private 접근 제한: private 접근 제한은 동일한 패키지이건 다른 패키지이건 상관없이 필드와 메소드를 사용하지 못하도록 제한합니다. 오로지 클래스 내부에서만 사용할 수 있습니다.

Getter와 Setter 메소드
객체지향 프로그래밍에서는 객체의 데이터를 외부에서 직접적으로 접근하는 것을 막습니다.
클래스 선언할 때 필드는 일반적으로 private 접근 제한
○ 읽기 전용 필드가 있을 수 있다. (Getter의 필요성)
○ 외부에서 알 수 없는 값으로 변경할 수 없도록할 수 있다. (Setter의 필요성)
G e t t e r
○ private 필드의 값을 리턴 하는 역할을 한다. - 필요할 경우 필드 값 가공한다.
○ getFieldName() 또는 isFieldName() 메소드로 작성한다. (필드 타입이 boolean 일 경우 isFieldName()으로 작성한다.)
S e t t e r
○ 외부에서 주어진 값을 필드 값으로 수정한다. (필요할 경우 외부의 값을 유효성 검사한다.)
○ setFieldName(타입변수) 메소드로 작성한다. (매개 변수 타입은 필드의 타입과 동일하다.)
어노테이션
자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용하는데, JDK 1.5 버전 이상에서 사용 가능하다.
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행시(런타임시)특정 기능을 실행하도록 정보를 제공
@Override
- 선언한 메서드가 오버라이드 되었다는 것을 나타냅니다.
- 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킵니다
@Deprecated
- 해당 메서드가 더 이상 사용되지 않음을 표시합니다.
- 만약 사용할 경우 컴파일 경고를 발생 키십니다.
@SuppressWarnings
- 선언한 곳의 컴파일 경고를 무시하도록 합니다.
@SafeVarargs
- Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시합니다.
@FunctionalInterface
- Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션입니다.
- 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생 시킵니다.
기타 어노테이션에 적용되는 어노테이션 (메타 애터네이션)
@Retention
- 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정합니다.
- 종류는 다음과 같습니다.
- RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
@Documented
- 해당 어노테이션을 Javadoc에 포함시킵니다.
@Target
- 어노테이션이 적용할 위치를 선택합니다.
- 종류는 다음과 같습니다.
- ElementType.PACKAGE : 패키지 선언
- ElementType.TYPE : 타입 선언
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
- ElementType.CONSTRUCTOR : 생성자 선언
- ElementType.FIELD : 멤버 변수 선언
- ElementType.LOCAL_VARIABLE : 지역 변수 선언
- ElementType.METHOD : 메서드 선언
- ElementType.PARAMETER : 전달인자 선언
- ElementType.TYPE_PARAMETER : 전달인자 타입 선언
- ElementType.TYPE_USE : 타입 선언
@Inherited
- 어노테이션의 상속을 가능하게 합니다.
@Repeatable
- Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줍니다.

'JAVA > JAVA 정리' 카테고리의 다른 글
[JAVA] 인터페이스 (0) | 2023.05.08 |
---|---|
[JAVA] 상속 (0) | 2023.05.07 |
[JAVA] 참조 타입 (0) | 2023.05.05 |
[JAVA] 연산자와 연산식 (0) | 2023.05.04 |
[JAVA] 반복문 (for문, while문, do-while문) (0) | 2023.05.04 |