[자바JAVA]클래스 : 패키지, 임포트, 접근제어자, 데이터 은닉과 보호, 싱글턴디자인패턴
toString()
Object는 최상위객체이다.
이 객체의 메서드중의 하나는 toString()이다.
따라서 모든 클래스에서 toString()을 사용할 수 있다.
- retrun : 객체생성했을때 메모리에 올라가진 주소값을 유니크한 표현방식인 해쉬코드로 리턴.
하지만 리턴값이 객체의 특성을 충분히 반영하지는 못한다.
따라서 그대로 사용하는 개발자는 아무도 없고 메서드오버라이딩을 해서 원하는 리턴값으로 변화시킨다.
리턴값을 변화시킬때 이클립스에서 개발자가 보기편하게 포맷팅해서 제공하는 단축키가 있다.
- alt + shift + s 후에
Generate toString()
을 클릭해서 ok누르면 리턴값 보기편하게 자동생성됨. - toString은 하나하나 직접 타이핑하기 보단 자동 단축키로 만들어서 쓰는 거임.
패키지
작성한 많은 클래스를 체계적으로 관리해야한다.
이때 자바는 디렉토리(폴더)대신 패키지라는 것을 사용한다.
- 패키지 : 클래스를 모아 놓은 것
- 폴더 : 데이터를 모아 놓은 것
패키지 작성규칙
패키지명작성시 회사의 도메인주소를 거꾸로 작성 후 뒤에 점(.)을 찍고 회사에서 진행중인 프로젝트명을 이어서 작성한다.
- 맨 처음에는 회사 등소속늘 나타내고 주로 도메인을 사용하며 거꾸로 사용.
- 그 다음은 그 소속에서 벌어지고 있는 프로젝트 이름을 작성.
- 왜 도메인 주소를 쓸까?
도메인은 중복이 없는 고유한 값이다.
만약 세계 여러사람들과 겹치는 class 이름을 쓰더라도 패키지가 다르면 아예 구분이 되기때문에 패키지명은 꼭 고유한 값인 도메인주소를 사용한다.
1 | //회사도메인주소거꾸로.프로젝트명.용도 순으로 작성한다. |
임포트 (Import)
다른 패키지에 선언된 클래스를 사용하기 위해 필요한 키워드이다.
- import 선언위치 : package선언과 class선언 사이에 위치.
- import 선언방법
- import 키워드 뒤에 package명을 포함한 클래스명까지 모두 입력.
- * 를 사용하면 해당 package의 모든 클래스를 포함. but 하위패키지에 있는 클래스 import하진않는다
1 | import package_name.[package_name]class_name; |
제어자(Modifier)
제어자란 클래스, 변수, 메서드의 작성 시 함께 사용하여 부가적인 의미를 주는 키워드이다.
제어자의 종류는 크게 두종류이다.
- 접근제어자 : 총 4가지 public, protected, default, private암기필수, 멤버변수등을 사용할 수 있는 범위를 지정하는 키워드. 동시에 한개만 쓸수있다
- 그 외의 제어자 : final, static, abstract, synchronized등으로 접근지정자와 달리 public static final 처럼 여러개가 동시에 올 수도 있으며, 변수나 함수 등을 특별한 형태로 동작시키기 위한 용도로 쓰입니다.
접근제어자(Access Modifier)
자바에서는 접근지정자 = 접근제어자로 생각하면된다
사실 두 단어의 차이점이 존재하는데 자바에서는 크게 중요하지않다.
멤버등에 사용되며 해당 요소를 외부에서 사용할 수 있게 할 것인지를 제어한다.
- public : 누구나 접근 가능하다
- 하나의 파일에 하나의 public클래스만 있어야한다.
- public클래스는 main메서드를 포함하고 있는 클래스이다.
- protected : 같은 패키지 내에 있거나 상속받은 자손클래스에서만 졉근가능
- default(package-private) : 아무런 접근 제어자를 적어주지 않을 때이며, package-private라고도 불린다. 같은 패키지 내에 있을 때만 접근 가능하다.
- private : 해당 클래스 내에서만 접근 가능하다.
접근제어자 | 해당클래스안에서 | 같은패키지에서 | 상속받은클래스에서 | import한 클래스에서 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
- 접근지정자 범위
- public > protected > 기본접근지정자(디폴트) > private
- public이 가장 넓은 범위이다.
- 매서드오버라이딩시 접근지정자는 슈퍼클래스의 메서드보다 범위가 줄어들어서는 안된다. 커지는 건 가능.
그외의 제어자 : final 제어자
- 더는 바꿀 수 없음을 의미한다
- final사용위치
- 클래스 왼쪽 : 더 확장이 불가하므로 상속받을 수 없는 클래스다. 슈퍼클래스가 될 수 없다.
- 메서드 왼쪽 : 재정의 할 수 없다 = 오버라이딩할 수 없다.
- 변수 오른쪽 : 상수, 상속이 불가한 클래스
데이터 은닉과 보호(Encapsulation)
객체지향의 4대 특징(OOP Is A P.I.E)에서 E에 해당하는 특성이다.
개인정보의 경우 외부에서 변수에 직접 접근가능해서는 안된다. 따라서 정보에 대한 직접 접근을 막아야한다.
따라서 소중한 멤버번수들은 모두 private
접근 제어자를 가진다.
- 그럼 외부에서
private 변수
를 사용할 수 없을까?- 직접적으로 접근할 수 없고, getter, setter메서드를 통해서 접근할 수 있다.
- 캡슐화 = getter와 setter내에는 정보 보호를 위한 필요한 로직을 넣어서 부적절한 값의 설정을 방지할 수 있다.
Singleton 디자인패턴
객체가 여러 개 필요한 경우는 객체마다 가지는 멤버 변수의 값이 다를 경우이다.
만약 멤버변수가 없거나 같은 값만 사용되는 경우에는 굳이 여러 객체를 만들어 사용할 필요가 없다.
- 필요성
- 계속 연결과 반환을 반복하는 것보다 하나 또는 몇 개를 미리 만들어놓고 재사용하는 것이 리소스사용에 유리
- 특징
- private 접근 제어자 : 싱글턴 디자인 패턴의 출발점은 대상 객체를 외부에서 직접 생성할 수 없어야 하니까.
- 따라서 이 생성자에 접근할 수 있는 것은 이 클래스 내부만 가능.
1
private SingletonClass() {}
- 따라서 이 생성자에 접근할 수 있는 것은 이 클래스 내부만 가능.
- getter 메서드 : private 멤버변수에 접근할 수 있는 setter와 getter가 필요한데 외부에서는 어차피 객체를 만들 수 없기때문에 setter는 필요 없고 getter만으로 충분하다.
- static : 막상 getter를 쓰려고 보니 메서드에 접근할 수 있는 객체가 없다. 객체 없는 메서드를 사용하기 위해 메서드와 멤버변수에 static 선언이 필요해진다.
- private 접근 제어자 : 싱글턴 디자인 패턴의 출발점은 대상 객체를 외부에서 직접 생성할 수 없어야 하니까.
- 사용법
- 객체가 필요할 때 객체를 생성하는 것이 아니라 메서드를 호출하면 되고 이 메서드의 리턴은 언제나 하나의 객체일 것이다.
1 | private static SingletonClass instance = new SingletonClass(); |