객체(Object)
: 물리적이거나 추상적인 것들 중 다른 것과 식별 가능한 속성
→ 특징
1. 속성(필드)과 동작(메소드)으로 구성
ex) 객체 - 사람
속성 - 이름, 나이
동작 - 웃다, 걷다
2. 객체 모델링: 현실세계의 객체를 소프트웨어의 객체(= 필드 + 메소드)로 정의하는 것
3. 객체&메소드 호출: 객체에 도트(.) 연산자를 붙여 호출
객체 간의 관계
1. 집합 관계
: 완성품 객체 내에 여러 객체가 속함
2. 사용 관계
: 객체 간의 상호작용
ex) 사람이 자동차를 사용 → 달린다, 멈춘다 메소드 호출
3. 상속 관계
: 상위(부모) 객체와 하위(자식) 객체를 갖는 관계
일반적으로 상위 객체는 종류, 하위 객체는 사물에 해당
ex) 기계(상위 객체) ↔ 자동차(하위 객체)
객체지향 프로그래밍(OOP)
: 객체를 모델링하고 집합 관계에 있는 집합 관계와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 개발하는 기법
→ 특징
1. 캡슐화(Encapsulation)
: 객체의 필드, 메소드를 하나로 묶어 실제 구현 내용을 감추는 것
숨긴 데이터와 메소드는 외부에서 접근 불가(외부로 인한 객체의 손상 방지)
접근 제한자를 사용하여 필드와 메소드의 사용 범위 제한
2. 상속(Inheritance)
: 상위 객체의 필드와 메소드를 하위 객체에게 물려주는 것(개발 시간 최소화)
3. 다형성(Polymorphism)
: 하나의 타입에 여러 객체를 대입하여 다양한 기능 구현 가능
클래스(Class)
- 자동차의 설계도와 비슷
- 인스턴스: 클래스로부터 만들어진 객체
- main 메소드가 없는 클래스는 객체 생성 과정을 거쳐 사용해야 함
- new 연산자를 사용하여 클래스로부터 객체 생성
ex) Student s1 = new Student();
클래스의 구성
public Class 클래스이름 {
int fieldName; // 필드
클래스이름() { // 생성자
...
}
void methodName() { // 메소드
...
}
...
public static void main(String[] args) { // 선택, 보통은 실행 클래스와 객체 클래스를 분리하므로 잘 안씀
...
}
}
1. 필드
: 객체의 상태를 저장하는 변수, 생성자와 메소드 내에서 사용됨
필드값 자동 초기화, 생성자와 메소드 밖에 선언
→ 객체가 소멸될 때 소멸
2. 생성자
: new 연산자로 호출되는 객체 초기화 담당 블록, 리턴타입 X
생성자가 실행되면 힙 영역에 객체 생성
반드시 존재, 하나 이상을 가질 수 있음
생략 가능(자동 생성)
매개변수를 가질 수 있음(필드 초기화에 사용)
클래스의 이름과 반드시 동일해야 함
→ 실행이 끝나면 자동 소멸
3. 메소드
: 객체의 동작 블록
→ 실행이 끝나면 자동 소멸
생성자 오버로딩(Overloading)
: 매개변수를 달리하는 생성자를 여러 개 선언하는 것
// 생성자 오버로딩 예시
public class Car {
Car() { ... }
Car(String model) { ... }
Car(String model, String color) { ... }
Car(String color, String model) { ... } // 오버로딩 X(순서만 다르므로)
...
}
- 단점: 중복 코드가 많이 생김
→ this() 코드를 사용하여 해결 가능
// this() 예시
public class Car {
String company;
String model;
String color;
int maxSpeed;
Car() { ... }
Car(String model) {
this(model, "black", 0);
}
Car(String model, String color) {
this(model, color, 0);
}
Car(String model, String color, int maxSpeed) { // 공통 실행 코드
this.model = model;
this.color = color;
this.maxSpeed;
}
color, String
model) { ... } // 오버로딩 X(순서만 다르므로)
...
}
매개변수의 수를 모를 경우? 배열로 선언
ex) int sum(int[] values) { ... }
혹은
int sum(int ...values) { ... }
메소드 오버로딩
: 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
매개변수의 타입, 개수, 순서 중 하나가 달라야 함
정적 멤버
: 객체를 생성하지 않고 사용이 가능한 필드와 메소드
- 타입 앞에 static을 사용하여 선언
- 메소드의 경우, 인스턴스의 필드를 사용하지 않는다면 정적 메소드로 선언
정적 초기화 블록
: 선언과 동시에 초기화가 불가능할 때 사용
내부에서 정적 변수 초기화와 정적 메소드 실행이 가능
static {
...
}
싱글톤(Singleton)
: 단 하나의 객체만 생성 가능하도록 보장
→ 생성자 앞에 private를 붙여 선언, 클래스 내에서 private static을 붙여 정적 필드로 클래스를 선언하고 정적 메소드를 통해 클래스를 리턴하도록 함
// 싱글톤 예시
public class 클래스 {
private static 클래스 singleton = new 클래스();
private 클래스() { }
static 클래스 getInsatance() {
return singleton;
}
}
final
: 수정 불가, 상속 불가, 필드 선언과 동시에 초기화하거나 생성자에서 초기화
- static final: 상수, 이름은 모두 대문자로 작성
패키지
: 클래스를 저장 · 관리하는 폴더
- 이름: 상위패키지.하위패키지.클래스 형태, 모두 소문자
접근 제한자
접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 (같은 패키지 + 다른 패키지 중 자식 패키지 내에서 사용 가능) |
default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스(같은 패키지 내에서 사용 가능) |
private | 필드, 생성자, 메소드 | 모든 외부 클래스(클래스 내부에서만 사용 가능) |
1. 클래스
: default 혹은 public
2. 생성자
: public, protected, default, private
자동 생성된 생성자의 경우 클래스의 접근 제한자와 같음
3. 필드, 메소드
: public, protected, default, private
Getter/Setter
: 객체 외부에서 객체에 직접 접근하여 데이터를 변경하는 것을 막기 위한 메소드
어노테이션(Annotation)
ex) @Override, @interface
public @interface AnnotationExample {
String value(); // 기본으로 생성해주는 엘리먼트(생략 가능)
String elementName1()
int elementName2() default 5;
}
- 용도
1. 코드 문법 에러 체크
2. 빌드나 배치 시 코드 자동 생성을 위한 정보 제공
3. 특정 기능 실행
- 특징
1. interface를 이용하여 선언
2. 배열 타입 사용 가능
ex) @controller(value1 = "1", value2 = "2");
3. 어노테이션이 적용될 대상을 지정할 때에는 @Target 사용
ex) @Target({ElementType.METHOD})
4. 생성자를 제외한 필드, 메소드, 클래스에만 적용 가능
'Language > Java' 카테고리의 다른 글
Java - 중첩 클래스와 중첩 인터페이스, 예외 처리 복습 (0) | 2021.06.25 |
---|---|
Java - 인터페이스 복습 (0) | 2021.06.24 |
Java - 상속 복습 (0) | 2021.06.23 |
Java - 참조 타입 복습 (0) | 2021.06.19 |
Java - 개념, 변수, 연산자, 조건문과 반복문 복습 (0) | 2021.06.18 |