[Java] 2020.11.03. day_10 getter,setter,생성자,추상화하여 클래스 만들기
2020. 11. 3. 17:06ㆍWeb_Back-end/Java SE
◎ getter, setter method
○ getter method
getter method | |
특징 | class 의 instance 변수가 private으로 설정 되어있을 때, instance 변수의 값을 클래스 외부에서 받아가기 위해서 만드는 method |
get을 접두어로 사용하고 변수명을 붙여서 만들어준다 | |
get변수명 형식을 가진다 | |
규칙 | public 반환형 get변수명( ){ return 변수명; } |
예 | class Test{ private int age; public int getAge(){ return age; } } |
○ setter method
setter method | |
특징 | 클래스 instance 변수의 값을 변경하기 위한 method |
instance 변수는 외부에서 값을 직접 변경하지 못하도록 접근지정자를 대부분 private으로 설정 --> 유효성검증을 수행하기 어렵기 때문에 |
|
--> method통해서 값을 설정하면 유효성검증을 수행할 수 있다 | |
==> 사용의 편의성, 중복코드의 최소화 | |
규칙 | public void setXxxx( 매개변수 ){ this.변수명=매개변수명; } |
예 | class Test{ private int age; public void setAge(int age){ if(age>120){ age=0; } this.age=age; } } |
◎ 생성자 Constructor
Constructor 생성자 | |
특징 |
객체가 생성 될 때 가지고 있어야 할 초기화 값 |
코드를 정의하는 method의 일종 | |
생성자는 method 호출 하듯 직접 호출할 수 있다 | |
new로만 호출가능 (객체생성시에만 호출 가능) | |
개발자가 생성자를 하나도 정의하지 않으면 Compiler가 매개변수 없는 기본생성자 (Default Constructoe)를 생성해준다 | |
개발자가 생성자를 하나라도 정의하면 Compiler는 기본 생성자를 만들지 않는다 | |
생성자안에서 다른 생성자를 this() 나 super() 로 호출할 수 있다 | |
클래스의 이름과 동일하게 설정한다 | |
생성자는 상속되지 않는다 | |
작성법 | 접근지정자 클래스명 (매개변수 ..) { 객체가 가져야할 초기값 , 객체가 생성되면서 실행되어야할 코드 } |
생성자의 접근지정자 |
public : 클래스 외부에서 객체 생성가능 |
protected : 같은 패키지의 다른 클래스에서는 객체 생성가능 다른 패키지에서는 상속관계의 자식 클래스에서만 객체 생성가능 |
|
private : 클래스 안에서만 객체 생성가능 ( Singleton Pattern 으로 객체를 생성할 때) | |
default : 같은 패키지의 다른 클래스에서 객체 생성가능 다른 패키지에서는 객체화 불가능 |
|
기본 생성자 | 컴파일러가 생성하는 기본생성자의 접근지정자는 클래스의 접근지정자를 따라간다 |
◎ this , super
○ this
this | |
자신클래스와 관련된 일만 수행_keyword , method 형식 두 가지로 사용할 수 있다 | |
keyword형식 | -추후 배울 예정 |
method형식 | 자신클래스의 생성자를 호출할 때 사용 |
this(); : 기본생성자를 호출할 때 | |
this(값); : 매개변수 있는 생성자를 호출할 때 | |
주의 : 재귀호출되는 상황이라면 에러발생 |
▼ 사람을 추상화하여 클래스를 만들고 test 해보기 ▼
package day1103;
/**
* 사람을 추상화하여 만드는 클래스<br>
* 명사적 특징 : 눈,코,입,이름<br>
* 동사적 특징 : 먹는일 <br>
* 일반클래스이고 객체화를 하여 사용<br>
* 객체화문법 : Person 객체명=new Person();<br>
*
* @author owner
*/
public class Person {
private int eye, nose, mouth; //눈,코,입
private String name; //이름
/**
* 사람 클래스의 기본 생성자<br>
* 눈 2개, 코 1개, 입 1개
*/
public Person() {
eye = 2;
nose = 1;
mouth = 1;
name = "";
}
/**
* @param eye 눈
* @param nose 코
* @param mouth 입
*/
public Person(int eye, int nose, int mouth) {
this.eye = eye;
this.nose = nose;
this.mouth = mouth;
}
/**
* 사람객체의 눈의 갯수를 설정하는 일
* @param eye 눈의 갯수
*/
public void setEye(int eye) {
this.eye = eye;
}//setEye
/**
* 사람객체에 설정된 눈의 갯수를 반환하는 일
* @return 눈의 갯수
*/
public int getEye() {
return eye;
}//getEye
/**
* 사람객체의 코의 갯수를 설정하는 일
* @param nose 코의 갯수
*/
public void setNose(int nose) {
this.nose = nose;
}//setNose
/**
* 사람객체에 설정된 코의 갯수를 반환하는 일
* @return 코의 갯수
*/
public int getNose() {
return nose;
}//getNose
/**
* 사람객체의 입의 갯수를 설정하는 일
* @param mouth 입의 갯수
*/
public void setMouth(int mouth) {
this.mouth = mouth;
}//setMouth
/**
* 사람객체에 설정된 입의 갯수를 반환하는 일
* @return 입의 갯수
*/
public int getMouth() {
return mouth;
}//getMouth
/**
* 생성된 사람객체에 이름을 설정하는 일
* @param name 설정할 이름
*/
public void setName(String name) {
this.name=name;
}//setName
/**
* 사람객체에 설정된 이름을 반환하는 일
* @return 이름
*/
public String getName() {
return name;
}//getName
/**
* 사람 객체의 동사적인 특징<br>
* 사람객체가 집에서 밥을 먹는 일 구현
* @return 밥을 먹는 행동
*/
public String eat() {
return name + "이(가) 집에서 밥을 먹는다";
}//eat
/**
* method Overload : 같은 이름의 method를 여러개 만드는 것<br>
* 사람 객체가 밖에서 밥을 사먹는 일
* @param menu 음식의 종류
* @param price 음식의 가격
* @return 식당에서 사먹는 일
*/
public String eat(String menu, int price) {
return name + "이(가) 식당에서 " + menu + "인 음식을 " + price + "원 내고 사먹는다";
}
public String face() {
return "눈 갯수: " + eye + " 코 갯수: " + nose + " 입 갯수: " + mouth;
}
}//class
package day1103;
/**
* 사람 객체를 사용하는 class
* @author owner
*/
public class UsePerson {
public void test() {
System.out.println("...");
}
/**
* Java Application
* @param args 입력값
*/
public static void main(String[] args) {
UsePerson up = new UsePerson();
up.test();
//객체화
Person jang = new Person();
jang.setName("홍길동");
//생성자가 있다면 값을 설정하는 코드는 필요없다 ==> 생성자에서 기본값을 설정해 두었기 때문에
// jang.setEye(1);
// jang.setMouth(2);
// jang.setNose(3);
// System.out.println(jang.getName() + "의 눈의 갯수: " + jang.getEye());
System.out.println(jang.face());
System.out.println(jang.eat());
//자신이름으로 객체를 만들고 눈,코,입,이름 설정하고, 먹는 일 수행
//getter,setter method 호출
//동적인 method 호출
Person nam = new Person();
nam.setName("남길동");
// nam.setEye(1);
// nam.setMouth(2);
// nam.setNose(3);
System.out.println(nam.eat("볶음밥",8000));
System.out.println(nam.eat());
System.out.println("눈의 갯수: " + nam.getEye() + "\n입의 갯수: " +
nam.getMouth() + "\n코의 갯수: " + nam.getNose());
Person jinban = new Person(3,1,1);
jinban.setName("천길동");
System.out.println(jinban.eat());
System.out.println(jinban.eat("콩볶음",0));
}//main
}//class
▼ 생성자 예제 ▼
package day1103;
public class TestConstructor {
/**
* 기본생성자
*/
public TestConstructor() {
System.out.println("기본생성자");
}
/**
* 생성자의 Overload : 생성자를 여러개 만들 수 있으므로<br>
* 객체화를 다양하게 할 수 있다
* @param i 매개변수
*/
public TestConstructor(int i) {
System.out.println("매개변수 있는 생성자");
// TestConstructor(); //생성자는 직접 호출할 수 없다
// new TestConstructor(); //생성자는 new를 붙여서 호출해야 한다
// method(); //method는 직접 호출가능
}
public void method() {
System.out.println("일반 instance method");
}
public static void main(String[] args) {
new TestConstructor();
new TestConstructor(2);
}//main
}//class