캡슐화

문세연·2024년 9월 9일

JAVA

목록 보기
9/19

캡슐화 : 객체의 데이터(필드), 동작(메소드)을 하나로 묶고 구현 내용을 외부에 감추는것

외부 객체 = 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용 가능. 노출된 메서드와 데이터는 호출과 읽기, 쓰기가 가능한데 캡슐화로 숨긴 데이터는 읽기, 쓰기나 호출도 불가능하다. 필드와 메소드를 캡슐화하여 보호하는 이유가 외부의 잘못된 사용으로 객체가 손상되지 않도록 하는데에 있음.
이런 캡슐화된 멤버(클래스 속에 있는 데이터)를 노출시킬 것인지, 숨길 것인지를 결정하기 위해 '접근 제한자'를 사용한다.

객체 간의 관계 :
종류 : 집합, 사용, 상속 등이 있음.

집합 : 완성품과 부품의 관계 : ex) 자동차 = 엔진, 타이어, 핸들 등으로 구성되므로 자동차와 부품들은 집합 관게라고 볼 수 있음.

사용 : 다른 객체의 필드를 읽고 변경하거나

  • 필드, 생성자, 메서드
    : 필드 : 객체의 데이터가 저장되는 곳, 주로 메서드에서 변수와 비슷한 형태로 선언된다. 다만, 생성자와 메서드 내에서만 사용하고, 생성자와 메서드가 실행 종료되면 자동 소멸이 된다. 필드 - 생성자와 메서드 전체에서 사용되고, 객체가 소멸되지 않는 이상은 계속 객체와 존재.

생성자 : new 연산자로 호출되는 특별한 중괄호 블록이라고 할 수 있다. 객체시 초기화를 담당하고 (필드 초기화 혹은 메서드 호출해서 객체를 사용할 준비) - 반환 타입이 없다. - 객체가 가진 정보들을 초기화해줌.

메서드 : 객체의 동작을 함. 필드를 읽고 수정하는 역할을 함. 다른 객체를 생성해서 다양한 기능을 수행하기도 함.

링크텍스트

그니까 진짜 쉽게 정리해보자.

필드 : 객체의 정보가 담겨있음. 인간, 눈동자 색 : 검은색, 머리 색 : 검은색 뭐 이런 류의 정보임. 변수와 언뜻 비슷해보이지만 형태만 유사할뿐 변수가 아니다. 그리고 메소드 내부에 선언된다!는게 중요.

그럼 변수는 뭘까? : 클래스에 포함된 변수를 말함. 변수에는 특정 값을 할당 가능, 이르 통해 객체의 특성을 만들어줄 수 있음.

링크텍스트

  1. 클래스 변수 (static Variable)

클래스 영역에 위치한 (메서드 안이 아닌) 변수 중 static 제어자를 가진 변수를 클래스 변수라고 한다.
static 제어자가 붙으면 클래스 내에서 단 한번만 생성된다. - 자바 스트립트의 const와 유사한 개념. : const는 constant의 약자로, 값을 저장하는 식별자이자 상수라고 할 수 있음. '항상 같은 값'으로 이름을 한 번 붙이면 값 수정 불가능.
해당 클래스 내의 모든 인스턴스가 공유해야 하는 값을 유지할 때 사용한다.

  • 선언 = 식별자가 어떤 데이터를 가지는지 알려주는 것 = "선언한다"고 함.

상수를 쓰는 이유 = 값을 수정할 수 없지만 저장 효율이 좋음, 변수는 수정 가능한 대신 저장 효율 나쁨.

  1. 인스턴스 변수 (instance Variable)

클래스 영역에 위치한 (메서드 안이 아닌) 변수 중 static 제어자를 가지지 않은 변수를 인스턴스 변수라고 한다.
인스턴스 즉 객체마다 가져야 하는 고유의 값을 주기 위해 사용한다.
클래스 변수와 달리 인스턴스 변수를 생성시 인스턴스에 맞게 초기화된 변수가 새롭게 주어진다.

인스턴스란? - 그냥 클래스 내부의 객체를 의미. 근데 이게 선언을 해서 실체화를 해야 사용 가능함. 결국 인스턴스 멤버는 외부 클래스에서 사용하기 위해서는 객체를 먼저 생성해주고 '참조 변수'로 접근해서 가져와야 함.

정리 : 클래스 - 메서드 - 소스 코드의 구조가 있다. 클래스를 여러가지로 만들어서 다른 클래스의 기능이나 변수를 가져와서 사용하고 싶다고 치자. 그럼 이제 인스턴스 변수나 인스턴스 메서드는 외부에서 사용이 불가능함. 왜냐면 객체에 소속되어 있으니까(각각의 클래스 내부에 다 떨어져서 존재). 그래서 사용하기 위해서는 각 개체의 주소값을 불러와서 '참조 변수'로 새로 선언하여 사용할 수 밖에 없는 것.

객체와 클래스의 차이 : 객체 = 실제 메모리에 정의된 것 : ram에 heap 메모리.
클래스 : 그 속에 클래스가 존재, 멤버 변수, 필드, 메서드, 함수 등을 가짐.

인스턴스화 한다는 거 : 인스턴스 생성을 위해 new 생성자 사용하여 주소값을 가져옴과 동시에 새 변수에 할당함.

객체 : 붕어빵 - 클래스 : 붕어빵을 만들기 위한 틀 - 인스턴스 : 만들어낸 따끈한 붕어빵 1, 붕어빵 2...

  • 메소드는 예외적으로 객체에 저장된 존재가 아님. 객체는 그냥 그 객체의 특성(필드)을 담고 있는 개념에 불과, 메소드는 기능이자 설계도이기 때문에 객체 내부에 존재 불가. 그래서 메소드 영역에 따로 존재하지만, 객체 없이는 사용하지 못하도록 제한을 걸어둔 것 뿐. 예를 들어, 붕어빵 - 붕어빵 틀 가져와줘!랑 틀 냅다 가져와줘! 이건 정말 다르다. 뭘 위해 쓸건데를 모르니까.
  1. 지역변수 (local Variable)

클래스 영역 안에서 메서드, 생성자, 초기화 블럭 안에 있는 변수를 지역 변수라고 한다.
지역 변수는 해당 변수가 사용된 메서드, 생성자 내에서만 사용되고 밖을 벗어나면 소멸된다.
매우 자그마한 친구

static = const
변수 = let
이렇게 서로 유사!

접근 제한자 : 객체의 필드를 외부에서 변경 혹은 메소드를 호출할 수 없도록 막아야 할 필요 존재. 중요한 필드와 메소드가 외부로 노출되지 않아 객체의 무결성(결점이 없다)을 유지하기 위해서 필요. 캡슐화로 숨긴다.

public, protected, private - private으로 갈수록 접근 제한은 강화.

자바는 다형성을 통해서 다양한 정보들을 재사용할 수 있음. 그래서 저장공간 낭비가 적고, 수정이 용이해서 사용하기 편함.

생성자 접근 제한 : 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 달라짐.

필드와 메소드의 접근 제한 : 역시 위와 유사한 개념

profile
안녕하세용!

0개의 댓글