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

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

by 자몽주스 2023. 4. 12.
728x90
반응형

chap_07.zip
0.01MB

클래스

package chap_07;
// # 설계도 (블랙박스 설계도) / 블랙박스 설계도에서 4가지 데이터(인스턴스변수)가 있는 것
// 이 클래스에서는 메인 메소드가 필요없음
// 그냥 변수 정의해주기
// 정의한 변수를 인스턴스 변수라고 함
public class BlackBox {
	String modelName; // 모델명
	String resolution; // 해상도
	int price; // 가격
	String color; // 색상
// 인스턴스 변수 생성
}
package chap_07;

public class _01_class {

	public static void main(String[] args) {
		// 객체지형 프로그래밍
		// 특징 : 유지보수 용이
		// 높은 재사용성

		// 문자열 한번에 관리하기 - 배열사용
		// String[] items = {"CPU", "RAM", "하드디스크"};

		// 차량용 블랙박스
		// 모델명, 해상도, 가격, 섹싱

		// 우리가 만든 첫 번째 작품
		String modelName = "까망이";
		String resolution = "FHD";
		int price = 200000;
		String color = "블랙";

		// 새로운 제품을 개발
		String modelName2 = "하양이";
		String resolution2 = "UHD";
		int price2 = 30000; 
		String color2 = "하양";
		
		// 매번 비슷한 변수를 정의하는 건 효율적이지 못함 = class 사용해준다
		// class: 서로 다른 자료형이지만 서로 비슷한 것들끼리 모아둔 하나의 형태
		
		// 또 다른 제품을 개발?
		// 블랙박스 클래스로부터 객체 만들기 (클래스로부터 만들어지는게 객체이다)
		// 클래스 이름 적고, 객체의 이름을 적어준다
		BlackBox bbox = new BlackBox();
		// BlackBox 라는 클래스로부터 bbox라는 객체 만들기(생성) 성공
		// bbox 객체는 BalckBox 클래스의 인스턴스라고 표현 
		
		// 여러개 만들기 가능
		// 클래스 = 설계도. 객체 = 제품
		// 똑같은 클래스 BlackBox를 갖고 bbox2 라는 서로 다른 객체(제품)을 만들기 가능
		BlackBox bbox2 = new BlackBox();
				
		
		
	}
}
인스턴스 변수

package chap_07;

public class _02_instanceVariables {

	public static void main(String[] args) {
		// 블랙박스 객체 만들어주기
		// b1 이라는 객체 생성
		BlackBox b1 = new BlackBox();
		// 객체가 갖고있는 4가지 인스턴스 변수에 접근해서 값을 설정해줄 수 있음.
		b1.modelName = "까망이";
		b1.resolution = "FHD";
		b1.price = 200000;
		b1.color = "블랙";

		System.out.println(b1.modelName);
		System.out.println(b1.resolution);
		System.out.println(b1.price);
		System.out.println(b1.color);
// 처음 만든 블랙박스
		System.out.println("--------------------------------");
		// 새로운 블랙박스 제품 만들기
		BlackBox b2 = new BlackBox();
		b2.modelName = "하양이";
		b2.resolution = "UHD";
		b2.price = 300000;
		b2.color = "화이트";
		
		System.out.println(b2.modelName);
		System.out.println(b2.resolution);
		System.out.println(b2.price);
		System.out.println(b2.color);

// 설계도 따라서 만든 b1, b2 객체가 서로 다른 값들을 자기들끼리 갖고있는 것.
	}

}
클래스 변수

// # 설계도 (블랙박스 설계도) / 블랙박스 설계도에서 4가지 데이터(인스턴스변수)가 있는 것
// 이 클래스에서는 메인 메소드가 필요없음
// 그냥 변수 정의해주기
// 정의한 변수를 인스턴스 변수라고 함
public class BlackBox {
	String modelName; // 모델명
	String resolution; // 해상도
	int price; // 가격
	String color; // 색상
// 인스턴스 변수 생성

	// 변수생성하기
	// flase라는 값으로 초기화한 것 
	static boolean canAutoReport = false; // 자동신고기능 (아직 개발되진 않음)
	// 앞에 static을 붙이게 되면 이걸 "class 변수" 라고 한다.
	// 클래스 내의 클래스 변수라서. static 없이 붙은 건 "인스턴스 변수"
	// 인스턴스 변수 : 서로 다른 객체에서 서로 다른 값들을 가짐.
	// 클래스 변수 : 클래스로부터 만들어지는 모든 객체에 똑같이 공통적으로 적용된다.


}
1. 왜 boolean 을 사용한 거고, false를 정의한 건지

package chap_07;

public class _03_ClassVariables {

	public static void main(String[] args) {
		// 블랙박스의 기능
		// 블랙박스 객체 생성해주기
		BlackBox b1 = new BlackBox();
		b1.modelName="까망이";
		System.out.println(b1.modelName);
		
		BlackBox b2 = new BlackBox();
		b2.modelName="하양이";
		System.out.println(b2.modelName);
		
		// 특정범위를 초과하는 충돌 감지 시 자동신고기능 개발 여부
		System.out.println("- 개발 전 - ");
		System.out.println(b1.modelName + "자동신고기능 : " + b1.canAutoReport);
		System.out.println(b2.modelName + "자동신고기능 : " + b2.canAutoReport);
		// 둘다 아직 개발안됐으니까 false
		// 객체.변수명 보다는 클래스명.변수명 => 이런식으로 접근하는걸 더 권장. (BlackBox.canAutoReport);
		System.out.println("모든 블랙박스 제품 자동 신고기능 : " + BlackBox.canAutoReport);
		//까망이자동신고기능 : false / 하양이자동신고기능 : false / 모든 블랙박스 제품 자동 신고기능 : false
		
		// 기능 개발하기
		BlackBox.canAutoReport = true; //false를 true로 바꿔주기
		// true로 바꿨으니 이 클래스를 가진 모든 객체들 또한 true로 바뀌게 됨
		System.out.println("- 개발 후 - ");
		System.out.println(b1.modelName + "자동신고기능 : " + b1.canAutoReport);
		System.out.println(b2.modelName + "자동신고기능 : " + b2.canAutoReport);
		System.out.println("모든 블랙박스 제품 자동 신고기능 : " + BlackBox.canAutoReport);
	}   //까망이자동신고기능 : true / 하양이자동신고기능 : true / 모든 블랙박스 제품 자동 신고기능 : true


}
메소드

package chap_07;

// # 설계도 (블랙박스 설계도) / 블랙박스 설계도에서 4가지 데이터(인스턴스변수)가 있는 것
// 이 클래스에서는 메인 메소드가 필요없음
// 그냥 변수 정의해주기
// 정의한 변수를 인스턴스 변수라고 함
public class BlackBox {
	String modelName; // 모델명
	String resolution; // 해상도
	int price; // 가격
	String color; // 색상
// 인스턴스 변수 생성

	// 변수생성하기
	// flase라는 값으로 초기화한 것
	static boolean canAutoReport = false; // 자동신고기능 (아직 개발되진 않음)
	// 앞에 static을 붙이게 되면 이걸 "class 변수" 라고 한다.
	// 클래스 내의 클래스 변수라서. static 없이 붙은 건 "인스턴스 변수"
	// 인스턴스 변수 : 서로 다른 객체에서 서로 다른 값들을 가짐.
	// 클래스 변수 : 클래스로부터 만들어지는 모든 객체에 똑같이 공통적으로 적용된다.

	// 1) 자동으로 신고하는 기능을 메소드로 만들어보자!
	void autoReport() {
		if (canAutoReport) {
			System.out.println("충돌이 감지되어 자동으로 신고합니다.");
		} else {
			System.out.println("자동 신고 기능이 지원되지 않습니다.");
		} // 2) b1객체에서 이걸 사용해보자 (04_Method로 이동)

	}

	// 1. 메모리카드 기능을 메소드로 만들어보자!
	void insertMemryCard(int capacity) {
		System.out.println("메모리 카드가 삽입되었습니다.");
		System.out.println("용량은 " + capacity + "GB 입니다.");
	}
	// 1] 일반영상
	//    이벤트 영상 (충돌 감지한 영상)
	// 	  이렇게 두 영상이 분리되어있는데 영상의 총 개수 구하기
	//    일반영상은 타입을 1, 이벤트 영상은 타입을 2로 해서 받아온다.

	int getVideoMemoryCard(int type) {
		if (type == 1) { // 일반영상
			return 9; // 반환되는 값 임시로 적음
		} else if (type == 2) {
			return 1;
		}
		return 10; // 타입 알 수 없으면 전체 영상개수인 10을 반환

	}
}
1. return 꼭 써야하는지, 왜 쓴 건지

package chap_07;

public class _04_Method {

	public static void main(String[] args) {
		// 1. 객체를 생성해준다
	BlackBox b1 = new BlackBox();
	b1.modelName = "까망이";
	
	// 3) b1.을 통해서 접근해준다.
	b1.autoReport(); // 자동 신고 기능이 지원되지 않습니다.
	// 자동 신고 기능이 개발됨
	BlackBox.canAutoReport = true;
	b1.autoReport(); // 충돌이 감지되어 자동으로 신고합니다.		 
	
	// 2. 아까만든 메모리카드 메소드 호출
	b1.insertMemryCard(256);
	//메모리 카드가 삽입되었습니다.
	//용량은 256GB 입니다.

	// 2] 일반영상과 이벤트 영상
	int fileCount = b1.getVideoMemoryCard(1); //일반 영상 갖고오게 됨
	// 앞에 어떤 변수를 정해줘야 한다
	// b1객체의getVideoMemoryCard를 통해 반횐되는 값을 fileCount에 전달받게됨 
	System.out.println("일반 영상 파일 수 :" + fileCount + "개"); //일반 영상 파일 수 :9개
	
	fileCount = b1.getVideoMemoryCard(2); // 이벤트 영상
	System.out.println("일반 영상 파일 수 :" + fileCount + "개"); //일반 영상 파일 수 :1개
	
	}

}
메소드 오버로딩

package chap_07;

// # 설계도 (블랙박스 설계도) / 블랙박스 설계도에서 4가지 데이터(인스턴스변수)가 있는 것
// 이 클래스에서는 메인 메소드가 필요없음
// 그냥 변수 정의해주기
// 정의한 변수를 인스턴스 변수라고 함
public class BlackBox {
	String modelName; // 모델명
	String resolution; // 해상도
	int price; // 가격
	String color; // 색상
// 인스턴스 변수 생성

	// 변수생성하기
	// flase라는 값으로 초기화한 것
	static boolean canAutoReport = false; // 자동신고기능 (아직 개발되진 않음)
	// 앞에 static을 붙이게 되면 이걸 "class 변수" 라고 한다.
	// 클래스 내의 클래스 변수라서. static 없이 붙은 건 "인스턴스 변수"
	// 인스턴스 변수 : 서로 다른 객체에서 서로 다른 값들을 가짐.
	// 클래스 변수 : 클래스로부터 만들어지는 모든 객체에 똑같이 공통적으로 적용된다.

	// 1) 자동으로 신고하는 기능을 메소드로 만들어보자!
	void autoReport() {
		if (canAutoReport) {
			System.out.println("충돌이 감지되어 자동으로 신고합니다.");
		} else {
			System.out.println("자동 신고 기능이 지원되지 않습니다.");
		} // 2) b1객체에서 이걸 사용해보자 (04_Method로 이동)

	}

	// 1. 메모리카드 기능을 메소드로 만들어보자!
	void insertMemryCard(int capacity) {
		System.out.println("메모리 카드가 삽입되었습니다.");
		System.out.println("용량은 " + capacity + "GB 입니다.");
	}
	// 1] 일반영상
	// 이벤트 영상 (충돌 감지한 영상)
	// 이렇게 두 영상이 분리되어있는데 영상의 총 개수 구하기
	// 일반영상은 타입을 1, 이벤트 영상은 타입을 2로 해서 받아온다.

	int getVideoMemoryCard(int type) {
		if (type == 1) { // 일반영상
			return 9; // 반환되는 값 임시로 적음
		} else if (type == 2) {
			return 1;
		}
		return 10; // 타입 알 수 없으면 전체 영상개수인 10을 반환
	}

// 녹화하는 메소드 만들기 (레코드 메소드)
	//showDateTime: 날짜 정보 표시여부
	//showSpeed : 속도 정보 표시여부
	//min : 영상 기록 단위(분)
	void record(boolean showDateTime, boolean showSpeed, int min) {
		// 날짜 시간 정보를 넣을지 말지 결정 / 운행하고 있을 때 속도 정보 / 블랙박스 영상을 몇 분 단위로 끊어서 저장할 지
		System.out.println("녹화를 시작합니다.");
		if (showDateTime) {
			System.out.println("영상에 날짜 정보가 표시됩니다.");
		}
		if (showSpeed) {
			System.out.println("영상에 속도 정보가 표시됩니다");
		}
		System.out.println("영상은" + min + "분 단위로 기록됩니다.");
	}
	
	// 더 효율적인 레코드 메소드 만들기 (파라미터 타입이 다르거나, 개수가 다르면 오버로딩 가능) 
	void record() {
		record(true, true, 5); // 메소드를 오버로딩으로 가서 호출해보자
	}
}

package chap_07;

public class _05_MethodOverloading {

	public static void main(String[] args) {
		BlackBox b1 = new BlackBox();
		b1.modelName = "까망이";

		// 녹화하는 메소드 BlackBox 클래스에서 만들기
		// 만든 레코드 메소드 호출하기.
		b1.record(false, false, 10);
		// 표시하고 싶지 않은게 있으면 false를 써줌
		// 날짜 정보나 속도 정보는 원하지 않고 순수 시간만 보고싶은 것
		/* 출력결과:
		   녹화를 시작합니다. 영상은10분 단위로 기록됩니다.*/
		// true: 포함 / false: 미포함
System.out.println("----------------------------");
		b1.record(true, false, 3);
		/* 출력결과:
		 * 녹화를 시작합니다. 
		 * 영상에 날짜 정보가 표시됩니다. 
		 * 영상은3분 단위로 기록됩니다.
		 */
System.out.println("----------------------------");
		b1.record(true, true, 3);
		/* 출력결과:
		 * 녹화를 시작합니다. 
		 * 영상에 날짜 정보가 표시됩니다. 
		 * 영상에 속도 정보가 표시됩니다 
		 * 영상은3분 단위로 기록됩니다.
		 */
System.out.println("----------------------------");
		b1.record();
		
		/*
		 * 녹화를 시작합니다. 
		 * 영상에 날짜 정보가 표시됩니다. 
		 * 영상에 속도 정보가 표시됩니다 
		 * 영상은5분 단위로 기록됩니다.
		 */
	}

}
클래스 메소드

package chap_07;

// # 설계도 (블랙박스 설계도) / 블랙박스 설계도에서 4가지 데이터(인스턴스변수)가 있는 것
// 이 클래스에서는 메인 메소드가 필요없음
// 그냥 변수 정의해주기
// 정의한 변수를 인스턴스 변수라고 함
public class BlackBox {
	String modelName; // 모델명
	String resolution; // 해상도
	int price; // 가격
	String color; // 색상
// 인스턴스 변수 생성

	// 변수생성하기
	// flase라는 값으로 초기화한 것
	static boolean canAutoReport = false; // 자동신고기능 (아직 개발되진 않음)
	// 앞에 static을 붙이게 되면 이걸 "class 변수" 라고 한다.
	// 클래스 내의 클래스 변수라서. static 없이 붙은 건 "인스턴스 변수"
	// 인스턴스 변수 : 서로 다른 객체에서 서로 다른 값들을 가짐.
	// 클래스 변수 : 클래스로부터 만들어지는 모든 객체에 똑같이 공통적으로 적용된다.

	// 1) 자동으로 신고하는 기능을 메소드로 만들어보자!
	void autoReport() {
		if (canAutoReport) {
			System.out.println("충돌이 감지되어 자동으로 신고합니다.");
		} else {
			System.out.println("자동 신고 기능이 지원되지 않습니다.");
		} // 2) b1객체에서 이걸 사용해보자 (04_Method로 이동)

	}

	// 1. 메모리카드 기능을 메소드로 만들어보자!
	void insertMemryCard(int capacity) {
		System.out.println("메모리 카드가 삽입되었습니다.");
		System.out.println("용량은 " + capacity + "GB 입니다.");
	}
	// 1] 일반영상
	// 이벤트 영상 (충돌 감지한 영상)
	// 이렇게 두 영상이 분리되어있는데 영상의 총 개수 구하기
	// 일반영상은 타입을 1, 이벤트 영상은 타입을 2로 해서 받아온다.

	int getVideoMemoryCard(int type) {
		if (type == 1) { // 일반영상
			return 9; // 반환되는 값 임시로 적음
		} else if (type == 2) {
			return 1;
		}
		return 10; // 타입 알 수 없으면 전체 영상개수인 10을 반환
	}

// 녹화하는 메소드 만들기 (레코드 메소드)
	//showDateTime: 날짜 정보 표시여부
	//showSpeed : 속도 정보 표시여부
	//min : 영상 기록 단위(분)
	void record(boolean showDateTime, boolean showSpeed, int min) {
		// 날짜 시간 정보를 넣을지 말지 결정 / 운행하고 있을 때 속도 정보 / 블랙박스 영상을 몇 분 단위로 끊어서 저장할 지
		System.out.println("녹화를 시작합니다.");
		if (showDateTime) {
			System.out.println("영상에 날짜 정보가 표시됩니다.");
		}
		if (showSpeed) {
			System.out.println("영상에 속도 정보가 표시됩니다");
		}
		System.out.println("영상은" + min + "분 단위로 기록됩니다.");
	}
	
	// 더 효율적인 레코드 메소드 만들기 (파라미터 타입이 다르거나, 개수가 다르면 오버로딩 가능) 
	void record() {
		record(true, true, 5); // 메소드를 오버로딩으로 가서 호출해보자
	}	
// 블랙박스에 문제가 생겨서 고객센터에 전화하는 메소드(기능) 생성
// 클래스 메소드 만들어주기
// 일반 메소드하고 다른점: static이 붙어있다. 객체마다 서로 다른 동작을 하는 일반 메소드와 달리, 동작이 항상 똑같다.(모든객체에 공통적용)
	static void callServiceCenter() {
		System.out.println("서비스 센터로 연결합니다.");
		// 인스턴스 변수 modelName을 여기서 바꿔보자..!
		// modelName = "test"; // 오류가 뜸
		// 위의 클래스 변수 canAutoReport 를 바꿔보자..!
		canAutoReport = false; // 오류가 안 뜸
		// 무슨 차이일까? : static으로 선언한 클래스 변수는 static메소드에서 바로 사용 가능
		// 객체가 만들어져야 만들어지는 인스턴스변수는 static 클래스 메소드 내에서는 직접 접근이 불가능
	}
	
}

package chap_07;

public class _06_ClassMethod {

	public static void main(String[] args) {
		// 블랙박스 객체 생성해주기
		BlackBox b1 = new BlackBox();
		b1.callServiceCenter(); //서비스 센터로 연결합니다.
		
		BlackBox b2 = new BlackBox();
		b2.callServiceCenter(); //서비스 센터로 연결합니다.
		
		// 위의 문장들을 주석처리하고,
	    // 객체를 선언하지않고, 클래스의 클래스 메소드에 직접 접근하기
		BlackBox.callServiceCenter(); //서비스 센터로 연결합니다.
	}

}
728x90
반응형