[Java] 2020.11.03. day_10 getter,setter,생성자,추상화하여 클래스 만들기

2020. 11. 3. 17:06Web_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