10. [Java] 객체지향프로그래밍의 이해 /20230425
🧑🏻💻 TIL(Today I Learned)
객체지향 프로그래밍에서 핵심을 담당하는 네 가지 중 두 가지 "상속과 캡슐화"
1. 상속(Inheritance)
➡️ 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소(코드의 재사용)
➡️ 사진처럼 상속 관계에 있게 되면 상위 클래스 멤버를 하위 클래스가 사용할 수 있음
➡️ 하위 클래스의 멤버 개수는 상위 클래스와 같거나 많아야 함
➡️ 상속을 사용하면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스 작성할 수 있음 (코드의 중복 제거)
⭐️ 자바의 객체 지향 프로그래밍에서는 단일 상속(single inheritance)만 허용 다중 상속 x
🔎 포함 관계(composite)
➡️ 상속처럼 클래스를 재사용할 수 있는 방법
➡️ 클래스의 멤버로 다른 클래스 타입의 참조변수 선언하는 것
➡️ 작은 단위의 클래스를 만들고 조합해서 클래스를 만든다고 할 수 있음
class Point {
int x;
int y;
int r;
}
//아래와 같이 포함 관계로 나타낼 수 있음
class Circle {
Point c = new Point(); // Point 클래스의 참조 변수 선언
int r;
}
class Point {
int x;
int y;
}
🔎 클래스 간의 관계
- 상속 관계 : "~은 ~이다"(is -a)
- 포함 관계 : "~은 ~을 가지고 있다"(has-a)
- 둘 중 더 자연스러운 문장 선택
※ 절대적인 것은 아님, 하지만 대부분 포함 관계를 사용하는 경우가 더 많음
- 둘 중 더 자연스러운 문장 선택
🔎 Object 클래스 - 최상위에 위치한 상위 클래스
➡️ 자바의 모든 클래스는 Object 클래스로부터 확장됨
class ParentEx { // 컴파일러가 "extends Object" 자동 추가
}
class ChildEx extends ParentEx {
}
- 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 됨
→ 컴파일러가 자동으로 추가해줌 - 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받음
🔎 메서드 오버라이딩
➡️ 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것
➡️ 조건
- 선언부가 상위 클래스의 메서드와 일치해야 함
- 접근제어자를 상위 클래스의 메서드보다 좁은 범위로 변경할 수 없음(같거나 넓어야)
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없음
class Point {
int x;
int y;
String getLocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
String getLocation() {
return "x : " + x + ", y : " + y + ", z : " + z; // 메서드 오버라이딩 : 내용만 바꿈, 선언부는 바꿀 수 x
}
}
🔎 super vs super()
- super
- 상위 클래스의 객체, 객체 자신을 가리키는 참조변수, 인스턴스 메서드 내에만 존재, 상위의 멤버를 자신의 멤버와 구별할 때 사용
- super()
- 상위 클래스의 생성자 호출, 상위의 멤버는 상위의 생성자를 호출해서 초기화
- 하위의 생성자는 자기 자신만 초기화 가능하며 상위의 생성자를 호출해서 상위 멤버를 초기화할 수 있음
- ⭐️⭐️ 모든 생성자는 생성자의 첫 줄에 반드시 생성자를 호출함 ⭐️⭐️
→ 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super() 삽입
→ 만약 호출했는데 상위 클래스에 기본 생성자가 없으면 에러 발생
: 기본 생성자 만드는 것을 습관화하자!
📍 공통적으로 상속 관계를 전제로 함
2. 캡슐화(Encapsulation)
➡️ 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
➡️ 목적 : 정보 은닉(data hiding)
- 데이터 보호의 목적
- 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출 방지
외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 하고 데이터가 변경되더라도 다른 객체에 영향을 주지 않기에 독립성 확보할 수 있음!!!
🔎 패키지(pakage)
➡️ 서로 관련된 클래스의 묶음, 특정한 목적을 공유하는 클래스와 인터페이스의 묶음 (효과적인 관리 목적)
➡️ 클래스의 실제 이름(full name)은 패키지를 포함(java.lang.String)
➡️ 패키지는 하나의 디렉토리이고 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지에 속해있음
→ 디렉토리는 계층 구조(구분은 . (점)으로)
// 패키지를 생성했을 때
package practicepack.test; // 패키지 구문 포함. 패키지가 없다면 구문 필요없음
public class PackageEx {
}
🔎 import
➡️ 다른 패키지 내의 클래스를 사용하기 위해 사용
➡️ 클래스를 사용할 때 패키지 이름을 생략할 수 있음
⭐️ java.lang 패키지의 클래스는 import하지 않고도 사용 가능 (String, Object, System, Thresd…)
import 패키지 명.클래스 명; 또는 import 패키지 명.*;
- import문은 패키지문과 클래스 선언의 사이에 선언
- 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 붙여줘야 함
- 컴파일 시에 처리되므로 프로그램의 성능에 영향 없음
🔎 제어자(Modifier)
➡️ 클래스와 필드, 메서드, 생성자 등에 부가적인 의미 부여하는 키워드(명사를 꾸며주는 형용사 같은)
➡️ 하나의 대상에 여러 제어자 사용가능, 하지만 각 대상에 대해서 접근 제어자는 단 한 번만 사용가능
- 접근 제어자 : public, protected, (default), private
- 기타 제어자 : static, final, abstract, native, transient, synchronized 등
public static final int WIDTH = 200; // 접근 제어자는 한 번만 사용
public static void maint(String[] args) {
}
📍 접근 제어자(Access Modifier)
- private : 동일 클래스에서만 접근 가능
- default : 동일 패키지 내에서만 접근 가능
- protected : 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
- public : 접근 제한 없음
public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)
✍🏻 오른쪽으로 갈수록 범위 좁아짐
⭐️ 접근 제어자를 통해 외부로부터 데이터를 보호하고 불필요하게 데이터가 노출되는 것을 방지할 수 있음!
🔎 getter/ setter 메서드
➡️ 캡슐화를 유지하면서 데이터의 변경이 필요한 경우 사용
➡️ private 접근 제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때
- setter : 외부에서 메서드에 접근하여 값을 변경하게 해줌
- getter : 위에서 변경한 값을 읽어오는 데 사용
⭐️ 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경하여 캡슐화를 보다 효과적으로 달성할 수 있음
분명 요약해서 적는다고 적었는데 중요한 내용이기도 하니 제법 길어졌다. 혼자 코드도 직접 쳐 보고 이리저리 실행해 보면서 어느 정도 이해했다고 생각했는데 막상 마지막 체크 포인트 세션 때 문제를 풀어보니 헷갈렸다. 분명 알 것 같은데 모르겠는 이 기분...... 끝나고 다시 코드를 그리면서 실행 흐름과 오늘 배운 것들에 대한 것을 몇 번이고 곱씹어보았지만 아직 친해지려면 멀었다. 자기 전에 또 몇 번 돌리고 자야겠다. 그리고 자꾸만 용어가 헷갈리는 것들이 있어서 따로 정리하는 게 좋을 듯!
'SEB_BE_45 > 공부 정리' 카테고리의 다른 글
12. 객체지향프로그래밍의 심화 / 20230427 (0) | 2023.04.27 |
---|---|
11. 객체지향프로그래밍의 이해 / 20230426 (0) | 2023.04.27 |
09. [Java] 객체지향프로그래밍의 이해 /20230424 (0) | 2023.04.24 |
08. [Java] 객체지향프로그래밍의 이해 / 20230421 (0) | 2023.04.21 |
07. Java 기초 4 / 20230420 (0) | 2023.04.20 |