6챕터의 마지막!!
6-6 패키지와 접근 제한자
패키지 선언, import문, 접근 제한자, Getter/Setter
6-6은 아주 막연하게 알았던 import문이나 접근 제한자를 공부한다.
처음 보는 Getter/Setter은 뭘까 >.<?!
패키지
ㅇ엄청 많은 클래스들을 관리하기 위함!!
패키지를 선언하는 방법과, 패키지 간의 접근을 위한 접근 제한자를 공부한다.
아 뭔가 패키지끼리 접근 하는 거랑 접근 제한자랑 연관이 되어있던 거구나
ㅇ클래스 이름이 동일해도 패키지가 다르면 다른 클래스로 인식한다.
원래 클래스의 전체 이름이 '패키지 이름 + 클래스 이름' 이다. 패키지까지 봐야 한다.
패키지도 클래스 정보의 일부분이고, 클래스를 유일하게 만드는 식별자의 역할을 한다.
>>만약 클래스를 다른 공간에 이동시키고 싶으면 '패키지 전체를 이동해야 한다'
패키지는 클래스의 일부이다. 클래스만 따로 복사해서 이동하면 클래스를 사용할 수 없다.
클래스는 패키지에 소속되어있다. 항상 패키지가 따라가야 한다.
클래스 이름음 다음처럼 표현..
상위패키지.하위패키지.클래스
아.. 지금까지 이 책에서 패키지 이름을
sec01.exam01 처럼 지었는데 저 도트가 그런 개념이 있었구나
난 그것두 모르구......
-패키지 이름 규칙-
- 역시 특문은 $, _만 되며 숫자시작은 안됨
- java로 시작하는 패키지 사용하면 안됨. 자바 표준 API에서만 사용
- 모두 소문자 작성이 관례
재밌는 사실: 여러 회사가 개발에 참여할 때 패키지 이름이 중복되지 않도록 자기 회사 도메인 이름으로 패키지 이름을 정한다!!! ㅇ0ㅇ~!! +도메인 이름 역순으로 써준다고 한다! 포괄적인게 상위 패키지 되도록 하려고..!
그리고 마지막엔 프로젝트 이름 붙여주는게 관례라고 한다
ㅇJDK 8 이전에선 패키지가 없는 클래스 선언 가능했다. (default 패키지에 뒀다고 함) 하지만 11 이후에는 패키지 없는 클래스면 컴파일 에러!
import문
드뎌 import문의 정체를 자세히 아라보기!!
어떤 패키지의 클래스 or 인터페이스를 가져와 쓸 거라고 컴파일러에게 알려주는 것이다
<패키지 선언과 클래스 선언 사이이 작성>
import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;
ㅡㅡㅡㅡ
주의점: 상위패키지 import했다고 해서 하위패키지가 import되는 것은 아니다.
하위 패키지에 필요한 클래스가 있으면 하위 패키지까지 전부 다 써줘야 한다.
서로 다른 패키지에 동일한 클래스 이름이 존자하고 두 패키지 모두 import되었으면..
어떤 패키지의 클래스를 사용해야 할지 모호하기 때문에 컴파일 에러가 난다.
이럴 때는 그 클래스 사용할 때 '패키지까지 포함한' 클래스 전체 이름을 기술해야 한다.
다음 예시를 보자아
사용할 클래스가 겹치면 패키지 이름까지 다 다다다다 명시해줘야 한다.
ㅡㅡㅡㅡ
++import문 자동 추가기능도 있다! 우와
이클립스에는
사용된 클래스를 조사해서 필요한 import문을 자동으로 추가하는 기능이 있다...
현재 클래스에서 [Source] - [Organize imports]
또는
단축키ㅎ0ㅎ 컨+쉬+O
기본적으로 import 패키지.클래스;로 추가된다.
이클립스 설정을 통해서 import.패키지.*; 로 추가되는 걸로 변경도 가능하다.
접근 제한자 (Access Modifier)
접근 --> 클래스, 인터페이스, 멤버의 접근을 말한다.
ㅇ다른 패키지에서 어떤 클래스, 인터페이스를 사용 못하도록 막거나
ㅇ객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 (<-이거 해봤지!! 싱글톤 객체 배울때!!)
ㅇ필드나 메소드를 사용하지 못하게 막아야 하는 경우
접근 제한자를 사용한다.
세 가지 종류가 있다.
ㅇ public 접근제한자 : public임!! 외부 클래스에서 자유로이..
ㅇ protected 접근제한자 : 같은 패키지 or 자식 클래스 (다른 패키지에 속해도, 자식 클래스에서라면 사용할 수 있다.)
ㅇ private 접근제한자 : 외부에서 사용 불가. 그 클래스에서만 가능.
이런 접근 제한자가 명시되지 않으면
ㅇdefault 접근 제한을 가진다. : 같은 패키지 안에서만 사용할 수 있게 함.
접근 제한을 세 가지로 나눠 공부하자
1. 클래스의 접근 제한 ( public, default )
>>클래스 외/내부 접근 가능성에 따른다.
2. 생성자의 접근 제한 ( public, protected, default, private )
>>생성자가 어떤 접근 제한을 갖느냐에 따라 생성자 호출이 가능한지 불가능한지가 결정된다.
>>클래스에 생성자를 선언하지 않으면 컴파일러가 자동으로 기본 생성자를 추가한다고 했다. 이때 이 기본 생성자의 접근 제한은 클래스 접근 제한과 동일하게 된다.
3. 필드, 메소드의 접근 제한 ( public, protected, default, private )
>>오케이~!
Setter/Getter
객체 지향 프로그래밍에서는 객체에 외부에서 직접적으로 접근해 필드를 변경하는 것을 막는다.
객체의 무결성이 깨질 수 있기 때문이다.
그래서.. 객체 지향 프로그래밍에서는 메소드를 통해 필드를 변경하는 것을 선호한다.
외부에서 필드에 직접 접근하는 것을 막고, 메소드는 공개해서!
메소드를 통해 필드에 접근하도록 한다.
메소드로 매개값을 검증해서 유효할 경우에만 필드 값을 옳게 변경할 수 있도록 해 놓은 것이다.
이런 역할을 하는 메소드를 Setter이라고 한다.
검증 코드..
예를 들면
자동차의 속도를 정하는 메소드가 있다고 하면, 매개값으로 음수를 넣는 것은 부적절하다.
그래서 다음처럼 검증 코드를 작성할 수 있다.
void setSpeed(double speed) {
if (speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
한편..
외부에서 객체 데이터를 읽을 때에도 메소드를 거치는 것이 좋다.
필드값을 직접 다루면 부적절한 경우가 있다고 한다.
그래서 메소드를 통해 필드값을 가공한 후 외부로 전달하면 된다고 한다...
이런 메소드가 Getter이다.
예를 들어서..
자동차 속도를 마일에서 km단위로 환산해 외부로 리턴하는 메소도 getSpeed()메소드의 작성
double getSpeed() {
double km = speed * 1.6;
return km;
}
필드를 가능하다면 private로 선언해서 외부로부터 보호하는 것이 좋다.
그리고 나서
필드에 대한 Setter와 Getter 메소드를 따로 작성해서
필드값을 안전하게 변경하고 사용하는 것이 좋다
다음 예시처럼!!
다만
필드 타입이 boolean이면
Getter 이름은 get이 아닌 is로 시작하는 것이 관례. (<-이거 많이 봤다!)
예를 들면..
++만약에
외부에서 필드값 읽기만 하고 변경 못하게 하려면 Getter 메소드만 선언하자.
아니면 Setter 메소드가 private 접근 제한을 갖도록 선언하기.
++
이클립스에는 Getter과 Setter 자동 생성 기능도 있다.
필드를 선언한 다음에 [Source]->[Generate Getters and Setters] 하면
선언된 필드에 대한 게터, 세터를 자동으로 생성시킬 수도 있다.
완전 편하네!!
<Getter, Setter 메소드 익히기>
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/10 07-2 [타입 변환과 다형성] [자동 타입 변환] [강제 타입 변환] (0) | 2020.07.11 |
---|---|
[혼자 공부하는 자바] 7/09 07-1 [상속] [자식클래스] [부모클래스] [오버라이딩] [메소드 재정의] (0) | 2020.07.10 |
[혼자 공부하는 자바] 7/08 06-5 [인스턴스 멤버와 정적 멤버] [static] / [private] [접근제한자] / [final 필드] [상수] (0) | 2020.07.07 |
[혼자 공부하는 자바] 7/07 06-4 [메소드] (0) | 2020.07.07 |
[1주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.07.07 |