OOP 객체지향 특징 -캡슐화(Encapsulation)

하히호호·2024년 4월 3일
0

이전 OOP를 공부하면서 각각 조금 더 깊게 공부해야한다는 생각이 들었다.
OOP의 전반적인 정리

위의 글은 전반적인 내용을 다루고 있어서 각 중요한 개념들을 자세하게 코드로 알아보려고 한다.

캡슐화

상세한 내부 구현을 숨기므로써 의도와 목적에 맞게 프로그램이 상호작용하도록 유도하는 역할을 한다.

  • 객체에 선언된 내부 변수와 메소드를 하나로 패키징하는 특징을 가지고 있다.

-묶는다는 것은 응집도와 독립성을 높이므로

캡슐화

Java는 접근제어자를 통해 객체의 캡슐화 및 은닉화를 할 수 있다.

package my;

public class Jjanggu {
	public String name;
    protected int age;
    String zip;
    private int weight;
}
  • public : 같은 프로젝트 내에서 유효하다. 패키지가 달라도 된다.
  • protected : 같은 프로젝트 내에서 유효하다. 패키지가 다른 경우, 자식 클래스만 유효
  • default : 같은 패키지 내에서만 유효
  • private : 현재 클래스 내에서만 유효, 다른 클래스에서는 참조 불가

public

개방적인 접근제어자이다. 특별한 제약 조건없이 같은 프로젝트 안에 있는 클래스 어디에서나 호출이 가능하다.

package my;

public class Jjanggu {
	public String name;
}

즉, public 접근 제어자는 외부 접근이 가능하기 때문에 정보 은닉이 이뤄지지 않는다.

protected

상속과 연관이 있는 접근 제어자이다.(상속을 배우고 난 후 배우는 것이 좋다.)
해당 객체를 상속받은 객체만 접근할 수 있다.
자식 객체에서 부모 객체의 protected 객체에 접근할 수 있다.

부모 객체의 멤버 변수와 메소드의 접근 권한의 일부를 승계받는다.

default

별다른 접근제어자를 지정하지 않았다면 default 제어자가 기본으로 적용된다.

package my;

public class Jjanggu {
	default String zip;
    // String zip;
}

동일한 패키지에 내에서만 사용이 가능하다. 위의 코드에서 설명하자면 package명이 my인 곳에서는 사용이 가능하다.
패키지가 다를 경우, 불러오는 곳에서 해당 변수, 메서드를 찾지 못한다.

private

오로지 같은 클래스 내부에서만 사용이 가능하다.
다른 클래스에서 private로 선언된 변수, 메서드는 찾지 못한다. 은닉화를 위한 접근제어자이다.
내부의 메소드나 변수를 은닉하여 프로그램 의도에 맞춰 흘러가도록 유도한다.

package my;

public class Jjanggu {
	private int weight;
}

정리

객체가 의미를 갖기 위해서는 의도에 적절한 접근제어자를 사용하여 개방/폐쇄가 필요하다.

사용자들이 프로그램을 사용할때 개발자 혹은 해당 이해관계자가 원하는 방식대로 흘러가게 해줄 수 있으며 직접 접근을 막아 데이터 손실을 방지할 수 있다.


private로 변수와 메서드를 은닉화하여 보안성을 높였지만 아무 변화를 주지않고 사용한다면 final을 키워드를 사용하면 된다.

조금 더 생각해보면 '접근 제어자'이다.
private로 선언된 변수와 메서드는 제약을 조금 강하게 주는 것이다.


개발자를 자동차 정비사로 비유하곤 한다.

정비사(개발자)들이 모든 부품(메서드)을 직접 만들줄 알아야 정비를 할 수있는 것은 아니다.(부품을 잘 이해하고 있다면 당연히 시너지 효과는 클 것이다.)

정비사는 자동차 '부품'의 기능과 종류를 알고 있으면 된다. 각 독립된 부품을 가지고 하나의 자동차(객체)를 만들면 된다.
부품을 사용하는 방법을 알고 사용할 수 있어야한다.
하지만 엔진이 망가져서 자동차가 퍼졌다면 엔진과 관련된 부품부터 확인하며 엔진을 교체하면 된다.

즉, 내부의 동작은 안으로 숨기고 사용자에겐 그 부품의 사용법만 노출하면 된다.

보안성을 높이면서 생성자를 호출하며 사용할 수 있는 '적절한' 방법이 getter와 setter이다.

getter와 setter를 설명하려니 this.까지 설명해야해서 다음 포스팅에서 진행하겠다!

profile
읽히는 코드를 짜고싶습니다.

0개의 댓글