파일 시스템의 폴더 또는 클래스의 식별자 역할
(클래스 이름이 동일해도 패키지가 다르면 구별할 수 있다.)
패키지 선언 : package 상위패키지.하위패키지;
(패키지가 상, 하위로 구분된 경우는 .을 이용하여 표현)
패키지가 없는 클래스는 default 패키지에 포함된다.
다른 패키지에서 클래스를 불러오는 방법
package mj.company;
import mj.home.Car;
//mj.home에 있는 모든 클래스를 사용하려면 import mj.home*; 를 사용할 수 있다.
public class Phone{
Car c1 = new Car();
}
위 예시는 상위패키지 mj에 포함된 하위패키지로 home, compony패키지가 있다.
mj.compony패키지에 포함된 Phone클래스에서 mj.home패키지에 포함된 Car클래스를 사용하기 위해서 import문을 이용했다.
public : 외부 클래스가 자유롭게 사용가능
protected : 같은 패키지 또는 자식클래스에서 사용가능
private : 외부에서 사용 불가능. 같은 클래스에서만 사용가능
default : 같은 패키지에 소속된 클래스에서만 사용가능
생성자 접근 제한
생성자를 선언하지 않으면 클래스와 동일한 접근 제한을 가진다.
다른 패키지에 속한 클래스가 해당 클래스의 자식클래스면 protected 접근 제한이여도 사용가능하다.
객체의 무결성을 지키기 위해서 필드에 private 접근 제한을 하기도 한다.
그럴 때는 검사 또는 가공하는 단계를 거쳐서 필드를 사용하는데 이때 사용하는 메소드가 getter, setter 메소드이다. 필드값을 안전하게 변경하거나 사용가능해진다.
getter : 필드를 가공, 환산 등을 해서 외부로 제공하는 메소드
setter : 입력된 값 중 검증된 값만 객체의 필드로 저장하는 메소드
class Person{
//필드
private String name;
private int age;
//외부에서 이 변수값을 수정하지 못하게 하기 위해 private
//생성자
Person(){}
Person(String name, int age){
this.name = name;
this.age = age;
}
//getter, setter메소드
public void setName(String name) {this.name=name;}
public String getName() {return name;}
public void setAge(int age) {this.age=age;}
public int getAge() {return age;}
//동작 메소드
public void move() {
System.out.println("이동 중 .. ");
}
}
class Villain extends Person{
//필드
private String unique_key;
private int weapon; //무기
//생성자
Villain(){}
Villain(String name, int age, String unique_key,int weapon){
super(name, age);
this.unique_key =unique_key;
this.weapon =weapon;
}
//getter, setter 메소드
public void setUnique_key(String unique_key){this.unique_key =unique_key;}
public String getUnique_key() {return unique_key;}
public void setWeapon(int weapon) {this.weapon =weapon;}
public int getWeapon() {return weapon;}
//무기값을 무기로 바꾸는 메소드
public String getWeaponName(int n) {
String weapon;
switch(n) {
case 1:
weapon = "칼";
break;
case 2:
weapon = "총";
break;
default:
weapon = "---";
break;
}
return weapon;
}
//동작 메소드
public void printPerson(){
System.out.println("악당 이름 : "+ getName());
//person에 있는 이름을 가져와야한다. 그렇기에 getName을 이용해야함.
System.out.println("악당 나이 : "+ getAge());
System.out.println("악당 넘버 : "+ getUnique_key());
System.out.println("악당 무기 : "+ getWeaponName(getWeapon()));
System.out.println("------------------------");
}
}
public class ex1 {
public static void main(String[] args) {
//객체 생성
Villain v1 = new Villain("좀비",23,"V15003",1);
v1.printPerson();
System.out.print(v1.getName()+ " ");
v1.move(); //부모 클래스의 move메소드를 호출
}
}
이런 식으로 자동화된 툴을 사용하지않고 getter와 setter용도의 메소드를 사용할 수 있다.
setter 메소드
public void setName(String name) {this.name=name;}
getter 메소드
public String getName() {return name;}
<ex) setter 메소드를 이용하여 값 검증을 한다면?>
setter에 if문을 넣어 값이 옳지 못 하다면 this.name = "다시 입력하라"; 이런식으로 사용할 수 있다.
잘하고 계시군요 ㅎㅎ