728x90
객체 지향 프로그래밍(Object-Oriented Programming, OOP)
객체지향 프로그래밍은 아래 4가지 핵심 개념을 통해 지원
- 캡슐화
- 상속
- 추상황
- 다형성
위 4개 핵심 개념은 아래와 같이 분류 가능
- Class: 캡슐화 + 상속
- 캡슐화(Encapsulation)
- 상속(Inheritance): Extends
- Interface: 추상황 + 다형성
- 추상화(Abstraction): Interface and Abstract Class
- 다형성(Polymolphism): Class의 다형성 + Interface의 다형성
Class: 캡슐화 + 상속
클래스 = 데이터 + 행위
- 데이터: 필드(Field) 혹은 속성(Attribute)
- Primitive Type: 값을 담는 그릇, 값이 필수임, 값을 지정하지 않으면 기본값이 들어간다.
- int인 경우 default 값인 0 이 들어간다.
- Reference Type: 주소를 담는 그릇, 주소 값이 있어도, 없어도 됨. (Null 허용)
- Primitive Type: 값을 담는 그릇, 값이 필수임, 값을 지정하지 않으면 기본값이 들어간다.
- 행위: 메서드(Method) 위 데이터에 대한 접근이나 조작, 데이터를 사용한 작업 수행
캡슐화 -> 접근 제어자
Encapsulation 캡슐화란 최대한 필드를 감추고, 필드 조작을 위한 메서드는 최소화만 노출하겠다는 뜻이다.
클래스를 사용하는 이유: Encapsulatoin 캡슐화 (단순히 감춤이 아닌 독립된 시스템 구축)
- 객체지향 프로그래밍을 얼마나 잘하는가? = 얼마나 클래스(독립된 시스템 구축)를 잘 만드는가?
- "독립"의 영역을 어떻게 잘 "구분"하는가?
💡(데이터) 필드는 외부로 노출되는 것이 좋을가? 내부에 있는것이 좋을까?
- 내부로 감추어져야하는 경우: 메서드에서만 해당 데이터를 사용
- 외부로 노출되어야하는 경우: Getter를 사용하며, 특정 포맷을 적용하거나 필요 정보만 변환 노출
왜 굳이 필드 자체를 노출하지 않고, Getter를 사용? 필드 노출시 필드 값 자체 변경이 가능하기 때문이다.
먼저 감추는 것으로 시작하고, 외부 호출이 꼭 필요한지 매우 비관주의적으로 생각해본다.
💡메서드는 외부로 노출되는 것이 좋을가? 내부에 있는 것이 좋을까?
- 내부로 감추어져야하는 경우: 내부 메서드에서만 호출되는 경우
- 외부로 노출되어야하는 경우: 외부에서 호출되어야 하는 경우
먼저 감추는 것으로 시작하고, 외부 호출이 꼭 필요한지 매우 비관주의적으로 생각해본다.
접근 제어자
클래스 내 필드와 메서드 모두 접근 제어자를 통해 노출이 필요한 것만 최소한으로 외부로 노출
- private: 동일한 클래스 내에서만 접근 가능
- 이너 클래스 내 private 필드를 정의하더라도, 상위 클래스에서 필드로 바로 접근 가능
public class InnerClassPrivateField {
class InnerClass {
private String name;
InnerClass(String name) {
this.name = name;
}
}
public void main() {
InnerClass innerClass = new InnerClass("Aaron");
System.out.println(innerClass.name);
}
}
- protected
- 해당 패키지 내 클래스에서 접근 가능
- 상속 받은 클래스도 접근 가능
접근 제어자 언제, 어떤걸 사용해야하나
일반적으로 모든 필드를 Private으로 먼저 감추고, 그 이후로 선택적으로 필요에 따라
- 특정 필드의 노출이 필요하다면 Getter함수를 public으로 만들어 노출
- 특정 필드의 수정이 필요하다면 Setter 함수를 public으로 만들어 노출
- 필드들을 활용한 연산이 필요하다면 원하는 함수를 public으로 만들어 노출
객체 .toString() 오버라이딩
객체를 출력하(`System.out.println(member)`)면 내부에서 .toString()을 붙여서 출력해주는데, 이때 객체의 주소값이 출력된다.
객체 필드 값을 출력하기 위해서 .toString()을 재정의할 필요가 있다.
실습 코드
https://github.com/xxyeon/spring_inflearn/commit/a00b66f5be8ce7e4d5788ce0aab44329b9e5de7d
상속 -> Extends
- 캡슐화를 그대로 유지하되 (재사용) 데이터나 행위를 확장하기 위함
- 상속시 아래와 같은 문제 발생
- 갖고 싶지 않은 필드와 메서드까지 가질 수 밖에 없다.
- 사용하지 않는 필드와 메서드 까지 호출될 수 밖에 없다
위 단점을 해결하기 위해 상속(Inheritance)보다 조합(Composition)을 활용해야 한다.
728x90
'ASAC 웹 풀스택 > Spring Boot' 카테고리의 다른 글
Java 기본 문법 및 JVM 구성(10) - final, static (0) | 2024.09.29 |
---|---|
Java 기본 문법 및 JVM 구성(9) - DTO, VO (0) | 2024.09.28 |
Java 기본 문법 및 JVM 구성(8) - 정적 팩토리 메서드 (1) | 2024.09.28 |
Java 기본 문법 및 JVM 구성(7) - Builder: 객체 생성의, 모든 경우의 수를 지원 (0) | 2024.09.28 |
Java 기본 문법 및 JVM 구성(6) - Object(Lombok을 활용한): 객체 생성 (0) | 2024.09.28 |