본문 바로가기
> 프로그래밍 언어/JAVA

[나도코딩] 자바기본편 - 섹션 8 (2)

by 자몽주스 2023. 4. 15.
728x90

chap_07.zip
0.01MB
chap_08.zip
0.00MB

This

// appendModelName을 추가하는 메소드
	void appendModelName(String modelName) {
		// 여기a로 전달되는 modelName은 원래 갖고있던 인스턴스 modelName에 추가되는 것
		// mondelName 업데이트
		//modelName += modelName;
// 왜 까망이만 출력됐을까?
//		앞에있는 modelName은 "클래스 인스턴스"로 만들어진 modelName
//		뒤에있는 modelName은 전달값(String modelName)에서 받은 modelName
// 최신형+최신형
		// 전달받은 파라미터값을 한 번 더 업데이트하고 끝나게 되는 것일 뿐이다.
		// 파라미터가 아니고 인스턴스의 modelName을 명시하고 싶으면 this.을 붙여준다
		// this.을 붙여주면 클래스의 인스턴스 변수에 직접 바로 접근할 수 있다.
		// modelName이라는 똑같은 이름이 들어와도 this를 붙여버리면
		// 클래스 인스턴스 변수 modelName이고, this 없는건 파라미터로 전달받은 modelName이다
		this.modelName += modelName;
      //클래스 인스턴스변수 모델네임 += 파라미터로 전달받은 모델네임	
		
		// 그냥 파라미터로 전달받은 값 이름이 modelName아니라 다른 것일 경우
		// ex) modelName += s;
		// this 없이 사용해도 상관없음
		
		// this는 인스턴스 변수하고 전달받은 파라미터 변수의 이름이 똑같을 때 사용한다.
	}

}

package chap_07;

public class _07_This {

	public static void main(String[] args) {
		BlackBox b1 = new BlackBox();
		b1.modelName = "까망이"; // 까망이(최신형)으로 돋보이게 해주기.
		b1.appendModelName("(최신형)"); // appendModelName 메서드를 만들어야 한다 - BlackBox로 이동.
		
		// 업데이트 된 modelName 출력해보기
		System.out.println(b1.modelName); // 까망이. 최신형이 뜨지 않는다. this를 붙여주니까 뜸.
	}

}
생성자

 //08]  시리얼 넘버
	int serialNumber; // 시리얼 넘버가 됨
	// 값을 정의해주기 위해서 static 형태로된 int 변수를 만들어서 값을 1씩 더해주는 형태로 만들어보기	
	static int counter = 0; // 시리얼 번호를 생성해주는 역할을 함 // (처음엔 0이었다가 ++연산을 통해서 값을 증가)
	// 이 값을 생성자 내에서 해보기(바로 아래)
	
// 08]  생성자(Constructor) 만들어주기: 클래스명과 똑같이 적어주면 된다.
	 BlackBox() {
		 System.out.println("기본 생성자 호출");
		 this.serialNumber = ++counter;
		 // counter 가 0인데 ++ 해갖고 1이 serialNumber에 들어갈거고,
		 // 새로운 객체가 만들어질 떄는 counter 값은 인스턴스 변수가 아니기 때문에 1로 업데이트가 된 상태이고,
		 // 1이었던 값이 2가 될거고, 또 새로운 객체를 만들면 3이되고, 그런식으로 업데이트가 된다.
		 System.out.println("새로운 시리얼 넘버를 발급받았습니다: " + this.serialNumber);
	 } // 이 생성자를 호출할 떄는 시리얼 넘버를 자동으로 발급받게됨.
	   // 근데 바로 하단의 생성자를 받게되는 b2 객체의 경우에는 발급받지 못하게 되는 셈.
	   // b2객체가 발급받게 하려면 어떻게 해야될까..? => [1]
	 
 // 소괄호에다가 인스턴스 변수 4가지를 넣어보기
 // 일일이 인스턴스 변수 만들지 않고 BlackBox 생성자 만들어보기
	 BlackBox(String modelName, String resolution, int price, String color){
		 // [1] 여기에 this를 쓰면 b2도 발급받을 수 있게 된다 (아래의 예시)
		 this(); // 기본 생성자 호출
		 // [1] 이 this는 기본생성자를 바로 접근할 수 있게 해갖고,(ctrl+마우스 갖다대보면 확인 가능)
		 // 그 생성자의 동작을 그대로 수행하고 나서, 아래쪽의 동작을 하게 만듦.
		 // 결론: this 에다가 아무것도 넣지 않으면 아무 파라미터 없는 것이 호출되는 것. BlackBox() 같은거

		 System.out.println("사용자 생성자 호출");
		 this.modelName = modelName;
		 this.resolution = resolution;
		 this.price = price;
		 this.color = color;
		 
	 }

package chap_07;

public class _08_Constructor {

	public static void main(String[] args) {
		// 생성자: 객체가 만들어질 떄 자동으로 호출하는 메소드
		BlackBox b1 = new BlackBox();
		// 객체 만들어주고 BlackBox 클래스에 들어가서 생성자 만들어주기
		b1.modelName = "까망이";
		b1.resolution = "FHD";
		b1.price = 200000;
		b1.color = "블랙";
		System.out.println(b1.modelName);
		System.out.println(b1.serialNumber);
		System.out.println("--------------------------");
// 아까 BlackBox에서 만든 생성자 호출하기
		// 소괄호 속에다가 BlackBox 클래스에서 정의했던 파라미터들을 순서대로 넣어준다 
		// b2 객체는 b1 과 달리, 소괄호안에 모든 값들을 정의해줬기 떄문에 따로 b1.modelName과 같은 작업이 필요없다
		BlackBox b2 = new BlackBox("하양이", "UHD", 30000, "화이트");
		//값들이 정말 잘 들어갔는지 확인상 출력해보기
		System.out.println(b2.modelName);
		System.out.println(b2.serialNumber);
		//		기본 생성자 호출
		//		사용자 생성자 호출
		//		하양이
		//		UHD
		//		30000
		//		화이트

// 블랙박스에 시리얼 번호 *고유번호 넣기 
//시리얼 넘버	// (처음엔 0이었다가 ++연산을 통해서 값을 증가)
			
		
	}

}
Getter와 Setter

// 09) Getter & Setter
// Getter : 값을 갖고오는 메소드
// Setter : 값을 설정하는 메소드
	// modelName을 갖고오는 메소드를 생성해보기
	String getModelName() {
		return modelName;
	}
	// 앞에 get으로 시작하고있으니 getter가 된다

	// setter는 앞에 set으로 시작된다.
	// 파라미터로 String modelName을 전달받음
	void setModelName(String modelName) {
		this.modelName = modelName;
	}

	// 해상도에 대한 getter setter 생성하기
	// resolution getter 생성하기
	// getter 에서 조건을 줄 수 있음
	String getResolution() {
		  if (resolution == null || resolution.isEmpty()) {
		    // resolution 이라는 값이 null이면(아예없는 것), 또는 isEmpty() - 빈문자열(비어있을 떄)일 때는 true
		    return "판매자에게 문의해보세요";
		  }
		  return resolution;
		}

	// resolution setter 생성하기
	void setResolution(String resolution) {
		this.resolution = resolution;

	}

	// price 생성하기 (getter / setter)
	int getPrice() {
		return price;
	}

	void setPrice(int price) { // 가격같은 경우 최소금액 설정해주기
		if (price < 100000) { // 100000 보다 작으면 100000으로 함
			this.price = 100000;
		} else {
			this.price = price; // 100000보다 크면 그 값을 여기서 집어넣음
		}
	}

	String getColor() {
		return color;
	}

	void setColor(String color) {
		this.color = color;
	}
}
1. getter 에 retrun 쓴 이유
2. setter 에는 왜 this를 쓴 건지
3. return 2 번 사용한 이유, 활용법

package chap_07;

public class _09_GetterSetter {

	public static void main(String[] args) {
		// BlackBox의 생성자 부분을 주석처리
		// BlackBox 객체 만들기
		 BlackBox b1 = new BlackBox();
		 b1.modelName ="까망이";
		// b1.resolution = "FHD"; 실수로 해상도 부분을 넣지 않음
		 b1.price = 20000;
		 b1.color = "블랙";
		 
		 // 블랙박스 가격 할인 
		 b1.price =  - 5000;
	     System.out.println("가격 : " + b1.price + "원");
	     
	     // 고객문의 (블랙박스의 해상도를 여쭤봤다) 
	     System.out.println("해상도: " + b1.resolution); // null 출력됨 ( 값이 비어있음 ) - 올바른 답변을 하지 못함 
	
	     //게터 세터 만든 후 객체 다시 생성 : 오류를 줄일 수 있다
	     BlackBox b2 = new BlackBox();
	     //modelName 바로 넣는게 아니고 set을 써준다
	     b2.setModelName("하양이");
	     b2.setPrice(-5000);
	     b2.setColor("화이트");
	     
	     System.out.println("가격 : " + b2.getPrice() + "원");
	     System.out.println("해상도 : " + b2.getResolution());
	}

}
1. getter setter 사용법
접근제어자 (전반부)

package chap_07;

public class BlackBoxRefurbish {
	String modelName; // 모델명
	String resolution; // 해상도
	private int price; // 가격 
	// 가격에 private을 붙여주게 되면 해당 클래스 내에서만, BlackBoxRefurbish 내에서만 접근이 가능 
	// AccessModifier에는 price 부분이 빨갛게 뜨게 된다 (사용이 불가능해짐) getprice와 setprice만을 통해 접근 가능.
	String color; // 색상
	
// Getter & Setter 만들어주기 = alt + shift + s
	public String getModelName() {
		return modelName;
	}
	public void setModelName(String modelName) {
		this.modelName = modelName;
	}
	public String getResolution() { //여기 return 부분 지워버리고 넣어줌 
		  if (resolution == null || resolution.isEmpty()) {
			    return "판매자에게 문의해보세요";
			  }
			  return resolution;
	}
	public void setResolution(String resolution) {
		this.resolution = resolution;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {  //여기 this 부분 지워버리고 넣어줌 
		if (price < 100000) { 
			this.price = 100000;
		} else {
			this.price = price;
		}
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	
}
// AccessModifier에 사용해보기

package chap_07;

public class _10_AccessModifier {

	public static void main(String[] args) {
		// 접근 제어자
		// private : 해당 클래스 내에서만 접근 가능
		// public : 모든 클래스에서 접근 가능
		// default: (아무것도 적지 않았을 때) 같은 패키지 내에서만 접근 가능
		// protected : 같은 패키지 내에서, 다른 패키지인 경우 자식 클래스 접근 가능

				 BlackBoxRefurbish  b1 = new BlackBoxRefurbish();
				 b1.modelName ="까망이";
				 b1.setPrice(20000);
				 b1.color = "블랙";
				 
				 // 블랙박스 가격 할인 
				 b1.setPrice(-5000);
			     System.out.println("가격 : " + b1.getPrice() + "원");
			     
			     // 고객문의 (블랙박스의 해상도를 여쭤봤다) 
			     System.out.println("해상도: " + b1.resolution); // null 출력됨 ( 값이 비어있음 ) - 올바른 답변을 하지 못함 
			
			     BlackBoxRefurbish b2 = new BlackBoxRefurbish();
			     b2.setModelName("하양이");
			     b2.setPrice(-5000);  
			     b2.setColor("화이트");
			     
			     System.out.println("가격 : " + b2.getPrice() + "원");
			     System.out.println("해상도 : " + b2.getResolution());
	}

}
접근제어자 ( 후반부)

package chap_07;

public class BlackBoxRefurbish {
	public String modelName; // 모델명
	String resolution; // 해상도 - default로 두기 = 아무것도 앞에 안 적어두면 default.
	private int price; // 가격 
	protected String color; // 색상
	
// Getter & Setter 만들어주기 = alt + shift + s
	public String getModelName() {
		return modelName;
	}
	public void setModelName(String modelName) {
		this.modelName = modelName;
	}
	public String getResolution() { //여기 return 부분 지워버리고 넣어줌 
		  if (resolution == null || resolution.isEmpty()) {
			    return "판매자에게 문의해보세요";
			  }
			  return resolution;
	}
	public void setResolution(String resolution) {
		this.resolution = resolution;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {  //여기 this 부분 지워버리고 넣어줌 
		if (price < 100000) { 
			this.price = 100000;
		} else {
			this.price = price;
		}
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	
}
// AccessModifier에 사용해보기

package chap_07;

public class _10_AccessModifier {

	public static void main(String[] args) {
		// 캡슐화 (Encapsulation)
		// 정보은닉 (Information hiding)
		
		
		// 접근 제어자
		// private : 해당 클래스 내에서만 접근 가능
		// public : 모든 클래스에서 접근 가능
		// default: (아무것도 적지 않았을 때) 같은 패키지 내에서만 접근 가능
		// protected : 같은 패키지 내에서, 다른 패키지인 경우 자식 클래스 접근 가능

				 BlackBoxRefurbish  b1 = new BlackBoxRefurbish();
				 b1.modelName ="까망이";
				 b1.setPrice(20000);
				 b1.color = "블랙";
				 
				 // 블랙박스 가격 할인 
				 b1.setPrice(-5000);
			     System.out.println("가격 : " + b1.getPrice() + "원");
			     
			     // 고객문의 (블랙박스의 해상도를 여쭤봤다) 
			     System.out.println("해상도: " + b1.resolution); // null 출력됨 ( 값이 비어있음 ) - 올바른 답변을 하지 못함 
			
			     BlackBoxRefurbish b2 = new BlackBoxRefurbish();
			     b2.setModelName("하양이");
			     b2.setPrice(-5000);  
			     b2.setColor("화이트");
			     
			     System.out.println("가격 : " + b2.getPrice() + "원");
			     System.out.println("해상도 : " + b2.getResolution());
	}

}

package chap_08;

import chap_07.BlackBoxRefurbish; // chap_07에 있는 BlackBoxRefurbish를 쓰겠다는 의미

public class _00_AccessModifier {

	public static void main(String[] args) {
		// 객체 생성
		BlackBoxRefurbish b1 = new BlackBoxRefurbish();
		b1.modelName = "까망이"; // public
		// b1.resolution="FHD"; // default - 다른 패키지이므로 접근 불가.
		// b1.price = 200000; // class - 해당 클래스 내에서만 접근가능하므로 사용 불가
		// b1.color = "블랙" // protected - 패키지가 달라져버렸고, 자식클래스도 아니기 떄문에 접근불가
	}

}
728x90