-
[Java]STEP1 - 9) 패키지, import, 접근 제한자(public, protected, default, private), Getter와 Setter개발 공부/Java 2020. 9. 19. 17:10
본 게시글은 도서 "이것이 자바다" 동영상 강의를 듣고 기록하는 TIL(Today I Learned) 입니다.
모든 저작권은 출판사 한빛미디어와 신용권님께 있음을 알립니다.👍이번 게시물에서는 패키지의 개념과 import의 사용, 그리고 접근 제한자가 무엇인지
getter와 setter의 개념과 필요성에 대해서 알아보도록 하겠습니다.
1. 패키지와 import
프로젝트를 개발할 때 수십 개 혹은 수백 개의 클래스를 작성해야한다.
따라서 클래스를 체계적으로 관리하지 않으면 클래스 간의 관계가 뒤엉켜서 복잡하고 난해한 프로그램이 될 수 있다.
패키지는 이러한 클래스를 체계적으로 관리하기 위한 파일 시스템의 폴더 기능을 한다.
패키지는 다음과 같이 선언할 수 있다.
package 상위패키지.하위패키지패키지 이름에도 몇 가지 지켜야할 규칙이 있다.
- 숫자로 시작해서는 안되며 _과 $를 제외한 특수 문자는 사용할 수 없다.
- java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용해서는 안된다.
- 모두 소문자로 작성하는 것이 관례이다.
보통 회사에서는 회사 도메인 이름의 역순으로 패키지 이름을 지어준다.
이는 여러 개발 회사가 함께 하는 대규모 프로젝트나 다른 회사의 패키지를 이용해서 개발 할 때 패키지의 이름이 중복될 가능성이 있는데, 이를 막기 위함이다.
com.samsung.project1
com.hyundai.project2
com.sk.project3
...같은 패키지에 속하는 클래스들은 조건 없이 다른 클래스에서도 사용할 수 있다.
하지만 다른 패키지에 속하는 클래스를 사용하려면 두 가지 방법 중 하나를 선택해야 한다.
1. 패키지와 클래스를 모두 기술한다.
package com.mycompany;
public class Car {
com.hankook.Tire tire = new com.hankook.Tire();
}
위와 같은 방법으로 할 경우, 패키지가 짧다면 문제가 없지만
패키지 이름이 길거나 사용해야할 클래스가 많다면 코드가 굉장히 난잡해지고 복잡해지게 된다.2. import문을 사용한다.
package com.mycompany;
import com.hankook.Tire;
public class Car {
Tire tire = new Tire();
}
import를 사용하여 원하는 패키지에 들어있는 원하는 클래스를 불러오면
앞서 썼던 방법처럼 일일이 패키지 경로를 붙여주지 않아도 쉽고 깔끔하게 사용할 수 있다.Tip!!
이클립스에서는 Source -> Organize imports (단축키: Ctrl + Shift + O) 를 사용하면
이클립스 내에서 자동적으로 사용된 클래스를 조사하여 필요한 import문을 붙여준다.
2. 접근 제한자(Public, Protected, Default, Private)
main() 메소드를 가지지 않는 라이브러리 클래스를 설계할 때는 외부 클래스에서 접근할 수 있는 멤버와 접근 할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계하는 것이 바람직하다.
자바에서는 접근 제한자(Access Modifier)를 통해 특정 필드나 특정 메소드를 호출 할 수 없도록 제한할 수 있다.
접근 제한자에는 public, protected, default, private와 같이 네 가지가 있다.
접근 제한자 적용 대상 접근할 수 없는 클래스 public 클래스, 필드, 생성자, 메소드 없음 protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스 default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스 private 필드, 생성자, 메소드 모든 외부 클래스 2-1) 클래스의 접근 제한
클래스에 적용할 수 있는 접근 제한자는 public과 default 단 두 가지이다.
//default 접근 제한자
class Car { }
클래스를 선언할 때 아무것도 붙이지 않고 class 클래스명 ~~ 으로 작성하면 default 접근 제한을 가진다.
해당 클래스는 같은 패키지에서는 사용 가능하지만, 다른 패키지에서는 사용할 수가 없게된다.
//public 접근 제한자
public class Car { }
public 접근 제한을 가지게 되면 같은 패키지뿐만 아니라 다른 패키지에서도 제한 없이 사용할 수 있다.2-2) 생성자의 접근 제한
생성자에 적용할 수 있는 접근 제한자는 public, protected, default, private 이다.
public class ClassName {
//public 접근 제한
public ClassName() { }
public 접근 제한은 모든 패키지에서 아무런 제한 없이 생성자를 호출 할 수 있다.
//protected 접근 제한
protected ClassName() { }
protected 접근 제한은 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자를 호출 할 수 있다.
//default 접근 제한
ClassName() { }
default 접근 제한은 같은 패키지에서는 생성자를 호출할 수 있으나, 다른 패키지에서는 호출할 수 없다.
//private 접근 제한
private ClassName() { }
private 접근 제한은 동일 패키지이건 다른 패키지이건 상관없이 생성자를 호출할 수 없다.
}2-3) 필드와 메소드의 접근 제한
필드와 메소드도 생성자와 마찬 가지로 public, protected, default, private 접근 제한을 가질 수 있다.
생성자와 마찬가지로 필드와 메소드에도 접근 제한 방식은 똑같이 적용된다.
public 접근 제한은 모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용 할 수 있다.
protected 접근 제한은 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있다.
default 접근 제한은 같은 패키지에서는 필드와 메소드를 사용할 수 있으나, 다른 패키지에서는 사용할 수 없다.
private 접근 제한은 동일 패키지이건 다른 패키지이건 상관없이 필드와 메소드를 사용할 수 없다.
3. Getter와 Setter 메소드
일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
그 이유는 객체의 데이터를 외부에서 마음대로 읽고 변경하게 되면 객체의 무결성이 깨질 수 있기 때문이다.
만약 직접적으로 접근이 가능하다면 다음과 같은 상황이 발생할 수 있다.
public class Car {
int speed;
}
Car car = new Car();
car.speed = -100;
다음은 speed를 필드로 가지는 Car 클래스의 작성과, 그 아래에서 car 객체를 생성한 다음 필드의 값을 바꾼 것이다.
car.speed 처럼 도트(.)연산자를 통해 직접 접근하게 될 경우, 차의 속도가 -100이 되버리는 현상이 발생할 수 있다.
따라서 speed에 직접 접근하지 못하게 막고, 무결성 검사를 통해서 통과한 값만 적용할 수 있는 Setter 메소드를 사용해야 한다.따라서 객체 지향 프로그래밍에서는 메소드를 통해서 데이터를 읽거나 변경하는 방법을 선호하는데,
여기서 사용되는 메소드가 바로 Getter와 Setter 메소드이다.
Getter 메소드는 외부에서 객체의 데이터를 읽을 때 사용한다.
public class Car {
private int speed;
public int getSpeed() {
return speed;
}
}
먼저 접근하지 못하게 할 필드를 private 접근 제한을 적용시킨다.
다음으로 getSpeed()와 같은 Getter 메소드를 통해 해당 필드의 값을 return 한다.
이렇게 하면 외부에서는 speed에 직접적으로 접근하는 것이 불가능하고,
getSpeed() 메소드만을 이용해서 speed의 값을 불러올 수 있다.
Getter 메소드를 작성할 때는 get + 필드 이름(첫문자 대문자)의 형태로 작성한다.
만약 필드가 boolean 타입이라면 is + 필드 이름(첫문자 대문자)의 형태로 작성한다.다음으로 Setter 메소드는 외부에서 객체의 데이터를 변경할 때 사용한다.
public class Car {
private int speed;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
if (speed < 0) {
this.speed = 0;
} else {
this.speed = speed;
}
}
}
먼저 접근하지 못하게 할 필드를 private 접근 제한을 적용시킨다.
다음으로 Setter 메소드인 setSpeed의 파라미터에 해당 필드를 변경할 값을 받는다.
조건문을 통해서 speed가 음수인지 아닌지 무결성을 검사한다.
만약 음수라면 this.speed를 0으로 변경하고
음수가 아니라면 this.speed를 speed로 변경한다.
이렇게 하면 외부에서는 직접적으로 speed에 접근하는 것이 불가능하고
setSpeed() 메소드만을 이용해서 speed의 값을 변경할 수 있다.
Setter 메소드를 작성할 때는 set + 필드 이름(첫문자 대문자)의 형태로 작성한다.본 게시글은 여기서 마치겠습니다.
읽어주셔서 감사하고, 혹시나 틀린 부분이나 보완해야할 부분이 있다면 댓글에 남겨주세요~!
'개발 공부 > Java' 카테고리의 다른 글