다라다라V
article thumbnail
728x90
반응형

알약은 하나의 캡슐로 약들이 묶여있어 관리하기 편하고, 구분하기 위한 최소한의 모양만 유지합니다.

알약은 각 기능을 하는 성분들을 하나의 캡슐에 묶어 사용자가 먹거나 관리하는 것을 편하게 합니다. 또한 알약은 그 기능을 수행하기 위한 최소한의 부분 즉 외형만 공개하고 그 외의 것은 숨깁니다. 이를 통해 환자들은 알약을 쉽게 섭취하고 약으로서 편히 사용할 수 있는 것 입니다.

자바 객체는 데이터를 가지고 있는 "멤버 필드"와 그 기능을 하는 "메서드"로 기능들이 묶여있습니다. 때문에 개발자나 사용자가 객체를 유지  및 보수하기 좋습니다. 또한 객체의 멤버 필드나 메서드 중 필요한 부분만 접근하도록 하여 부적절한 접근을 막을 수 있습니다.

📌 캡슐화와 정보 은닉

📚 캡슐화(Encapsulation)

  • "데이터"와 관련된 "메서드"들을 하나의 객체로 묶는 것을 의미
  • 내부를 보호하여 보다 쉽고 안전한 사용을 가능하게 함
  • 자바는 단위 객체를 모아 큰 클래스로 만들 수 있기 때문에 반드시 하나의 클래스로 만들어야하는 것은 아님
  • 캡슐화가 잘 되어있다면 하나의 클래스가 변경되더라도 관련된 나머지 클래스는 최소한으로 변경됨

📚 멤버 필드에 대한 부적절한 접근 예

public class CircleTest2 {

  public static void main(String[] args) {
    Circle c1;
    c1 = new Cricle();
    c1.radius = 1;
    
    System.out.print("반지름 " + c1.radius + "인");
    System.out.print("원의 둘레는 " + c1.getCircumference());
    
    c1.radius = -99 // 부적절한 접근으로 원의 반지름을 갑자기 음수로 바꿀 수 있음
    
    System.out.print("원의 넓이는 " + c1.getArea());
  }
}

반지름은 항상 0보다 크게 유지되어야할텐데 객체가 일을 하기 전 불필요하게 값이 바뀌는 경우가 발생할 수 있습니다. 이렇듯 객체가 스스로 일을 하기 위해서는 안전한 처리가 필요합니다. 때문에 함부로 객체 내부에 들어가지 못하도록 최소한의 인터페이스만 들어내는 정보 은닉(Information Hiding)이 필요합니다.


📚 정보은닉(Information Hiding)

  • 객체 외부에 최소한의 인터페이스만을 드러내고 객체의 내부 구현은 숨길 수 있음
  • 부적절한 처리와 복잡한 구현을 막음
  • TV 자체는 복잡하게 구현되지만 시청자는 TV 리모컨만으로 TV를 사용하는 것과 비슷함
  • 멤버 변수 선언시 private 접근제어 지정자를 이용하여 객체 내부에서만 접근하도록 할 수 있음

[2. 멤버 필드에 대한 부적절한 접근 예]에서 본 Circle 객체는 반지름에 부적절하게 접근할 수 있었습니다. radius 멤버 public으로 만들어 메서드를 통한 안전한 접근만 허용되도록 만들 수 있습니다.


📚 각종 변수의 기본 유효 범위

📃 지역 변수와 매개 변수

  • 해당 메서드 안에서만 사용 가능
  • 메서드 시작 시 자동 할당, 메서드 반환 처리에서 자동 해제
  • 자바의 모든 변수는 class 안에서 선언되기 때문에 전역 변수가 없음

📃 멤버 변수

  • 모든 멤버 변수들은 그 클래스 객체 전체에서 유효한 범위를 가짐
  • 객체가 생성되면 할당되고, 객체가 소멸되면 할당 해제됨
  • 객체 속성을 지정하기 때문에 객체가 생성되어야 접근할 수 있음

📚 멤버 접근 제한

멤버에 접근하는 클래스 멤버의 접근 지정자
 private default protected public
같은 패키지의 클래스 X O O O
다른 패키지의 클래스 X X X O
접근 가능 영역 클래스 내 동일 패키지 내 동일 패키지와
자식 클래스
모든 클래스

📚 Access 메서드

  • 접근 지정자로 외부에서 값을 변경하지 못하도록 설정할 때, 내부 접근이 가능하도록 하는 것이 Access 메서드
  • 클래스 사용을 위해 객체 외부에서 부적절한 처리가 되지 않도록 함
  • 특정 멤버 변수의 값을 반환하는 getter( ) 메서드, 특정 멤버 변수를 실인수 값으로 설정하는 setter( ) 메서드 존재
  • 안전한 접근을 제공하기 위해 당장 필요없더라도 암묵적으로 객체 멤버를 조작하기 위한 메서드를 미리 만듦

📚 default 클래스와 public 클래스

📃 default 클래스

  • 접근제한자를 아무것도 적지 않을 때 기본 값
  • 같은 패키지 내부에서만 객체 생성이 가능

📃 public 클래스

  • class 키워드 앞에 public을 추가하여 어디서나 클래스 객체 생성을 허용
  • 하나의 소스 파일에는 하나의 클래스만 public이 될 수 있음
  • 소스 파일의 이름과 클래스의 이름이 반드시 같아야 함

 


📌 생성자

📚 생성자

  • 객체가 생성될 때 명시적으로 호출할 필요는 없이 단 한 번 자동으로 호출되는 일종의 메서드
  • Setter와 달리 객체의 멤버 변수 자동으로 초기화해줌
[접근제한] <생성자명> (매개변수1, ... ,매개변수 n)

생성자 구현 조건은 다음과 같습니다. 생성자는 public 영역에 선언하여 데이터 멤버를 초기화 시킬 수 있습니다.

  1. 생성자 이름은 클래스 이름과 같아야함
  2. 반드시 반환 자료형이 지정되지 않아야함
Circle();

📚 default 생성자

  • 프로그래머가 단 하나도 명시적으로 생성자를 정의하지 않은 경우 컴파일러에 의해 자동으로 제공
  • 생성자가 하나라도 정의되어 있으면 제공되지 않음
  • 인자가 없는 생성자로 초기화를 위한 아무일로 일어나지 않음
Circle c = new Circle();

new 연산자 인자 없는 메서드를 호출하여 default 생성자를 사용할 수 있습니다.


📚 매개변수를 가지는 생성자

  • 객체가 가질 instance 멤버 변수의 초기 설정값 객체 생성과 동시에 전달 받음
  • 객체 생성 직후 초기화 작업이 한 번에 수행됨
  • 프로그래머가 따로 값을 초기화할 일이 없어 안전한 초기화 가능
Circle c = new Circle(1);

객체 속성값을 생성과 동시에 선언하여 외부 접근을 차단합니다.


📚 생성자 오버로딩

  • 매개변수 리스트가 다른 생성자들로 생성자의 다중 정의 가능
  • 객체 초기화를 위해 인자가 여러 개 있을 수 있고, 없을 수도 있음
Circle c1 = new Circle(1); // 정수 인자를 받는 생성자
Circle c2 = new Circle(); // 인자를 받지 않는 생성자
Circle c3 = new Circle(2.58); // 실수형 인자를 받는 생성자

📚 this( )

인수가 많은 경우 생성자 별로 값을 지정하기 복잡합니다. 이때 가장 일반화된 생성자를 다른 생성자에서 사용하여 다른 생성자 구현시 사용할 수 있습니다.

  • 반드시 기존 생성자의 첫 행에 위치
  • 현재 클래스의 인수 리스트가 일치하는 생성자의 호출
  • 한 클래스 내의 특정 생성자 구현시 오버로딩되어 있는 다른 생성자를 호출

📌 가비지 컬렉션

📚 가비지 컬렉션(Garbage Collection)

  • 자바는 new 키워드에 의해 할당된 메모리를 다시 반납하는 소멸자를 가지지 않음
  • 어떤 참조 변수도 객체가 참조되지 않고 메모리가 부족한 경우 JVM의 가비지 컬렉터가 자동으로 할당을 해제
반응형

'코딩언어 > JAVA' 카테고리의 다른 글

[JAVA] 07-2 자바 기본 API  (0) 2022.10.20
[JAVA] 07-1 자바의 패키지와 모듈  (0) 2022.10.18
[JAVA] 05. 클래스의 멤버  (0) 2022.10.13
[JAVA] 04. 클래스와 객체  (0) 2022.10.12
[JAVA] # 포인터 VS 참조 자료형  (0) 2022.10.10
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!