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 영역에 선언하여 데이터 멤버를 초기화 시킬 수 있습니다.
- 생성자 이름은 클래스 이름과 같아야함
- 반드시 반환 자료형이 지정되지 않아야함
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 |