10. [Java] 객체지향프로그래밍의 이해 /20230425

2023. 4. 25. 22:56

🧑🏻‍💻 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)

  1. private : 동일 클래스에서만 접근 가능
  2. default : 동일 패키지 내에서만 접근 가능
  3. protected : 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
  4. public : 접근 제한 없음
public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)
✍🏻 오른쪽으로 갈수록 범위 좁아짐

⭐️ 접근 제어자를 통해 외부로부터 데이터를 보호하고 불필요하게 데이터가 노출되는 것을 방지할 수 있음!

 

 

🔎 getter/ setter 메서드

➡️ 캡슐화를 유지하면서 데이터의 변경이 필요한 경우 사용

➡️ private 접근 제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때 

  • setter : 외부에서 메서드에 접근하여 값을 변경하게 해줌
  • getter : 위에서 변경한 값을 읽어오는 데 사용 

⭐️ 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경하여 캡슐화를 보다 효과적으로 달성할 수 있음

 


분명 요약해서 적는다고 적었는데 중요한 내용이기도 하니 제법 길어졌다. 혼자 코드도 직접 쳐 보고 이리저리 실행해 보면서 어느 정도 이해했다고 생각했는데 막상 마지막 체크 포인트 세션 때 문제를 풀어보니 헷갈렸다. 분명 알 것 같은데 모르겠는 이 기분...... 끝나고 다시 코드를 그리면서 실행 흐름과 오늘 배운 것들에 대한 것을 몇 번이고 곱씹어보았지만 아직 친해지려면 멀었다. 자기 전에 또 몇 번 돌리고 자야겠다. 그리고 자꾸만 용어가 헷갈리는 것들이 있어서 따로 정리하는 게 좋을 듯! 

BELATED ARTICLES

more