나도코딩 자바 심화편_1일차(24.12.18)
#041 <클래스>
* 객체 지향 프로그래밍 (OOP: Object-Oriented Programming)
-객체들이 서로 어우러진 형태로 프로그램을 구성
-자바 → 객체 지향 프로그래밍 언어
-유지보수 용이
-높은 재사용성(기존에 작성한 코드를 다른 프로그램에서 사용)
-컴퓨터 부품: CPU, RAM, 하드디스크
String[] items = {"CPU", "RAM", "하드디스크"};
→ 같은 자료형일 경우 배열을 만들어서 데이터 관리할 수 있음
-차량용 블랙박스
모델명, 해상도, 가격, 색상
// 첫 번째 제품
String modelName = "까망이";
String resolution = "FHD";
int price = 200000;
String color = "블랙";
→ 자료형이 달라서 배열로 처리 불가
// 신제품 개발
String modelName2 = "하양이";
String resolution2 = "UHD";
int price2 = 300000;
String color2 = "화이트";
→ 두 개의 제품이면 변수 8개, 세 개의 제품이면 변수 12개...(비효율적)
// 또 다른 제품 개발
BlackBox bbox = new BlackBox();
→ BlackBox 클래스로부터 bbox 객체 생성
→ bbox 객체(결과물)는 BlackBox 클래스(설계도)의 인스턴스
종이접기 책(클래스)
책을 보고 만든 종이학(인스턴스=객체)
→ 하나의 클래스(설계도)를 가지고 여러 개의 인스턴스/객체(제품)를 만들 수 있음
// 같은 클래스로 만든 또 하나의 제품(객체)
BlackBox bbox2 = new BlackBox();
#042 <인스턴스 변수>
// 처음 만든 제품
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
b1.resolution = "FHD";
b1.price = 200000;
b1.color = "블랙";
// b1 객체가 가지고 있는 4개의 인스턴스 변수(필드)
System.out.println(b1.modelName);
System.out.println(b1.resolution);
System.out.println(b1.price);
System.out.println(b1.color);
// 새로 만든 제품
BlackBox b2 = new BlackBox();
b2.modelName = "하양이";
b2.resolution = "UHD";
b2.price = 300000;
b2.color = "화이트";
// b2 객체가 가지고 있는 4개의 인스턴스 변수(필드)
System.out.println(b2.modelName);
System.out.println(b2.resolution);
System.out.println(b2.price);
System.out.println(b2.color);
→ 각각의 객체들마다 서로 다른 인스턴스 변수값 가질 수 있음
→ b1, b2, b3... 각각 다르게 가능
붕어빵 기계 (클래스)
붕어빵 (인스턴스=객체)
속재료 (인스턴스 변수)
#043 <클래스 변수>
String modelName; // 모델명
String resolution; // 해상도
int price; // 가격
String color; // 색상
static boolean canAutoReport = false; // 자동 신고 기능
→ static 붙이면 클래스 변수 / 붙이지 않으면 인스턴스 변수
→ 클래스 변수: 해당 클래스로부터 만들어지는 모든 객체에 똑같이 적용
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);
System.out.println("모든 블랙박스 제품 자동 신고 기능 : " + BlackBox.canAutoReport);
→ - 개발 전 -
까망이 자동 신고 기능: false
하양이 자동 신고 기능: false
모든 블랙박스 제품 자동 신고 기능 : false
// 자동 신고 기능 개발
BlackBox.canAutoReport = true; // 이렇게 하나만 업데이트하면 모든 객체에 적용
System.out.println(" - 개발 후 - ");
System.out.println(b1.modelName + " 자동 신고 기능: " + b1.canAutoReport);
System.out.println(b2.modelName + " 자동 신고 기능: " + b2.canAutoReport);
→ - 개발 후 -
까망이 자동 신고 기능: true
하양이 자동 신고 기능: true
모든 블랙박스 제품 자동 신고 기능 : true
→ 클래스 변수는 클래스명.변수명으로 사용하는 게 일반적
System.out.println("모든 블랙박스 제품 자동 신고 기능 : " + BlackBox.canAutoReport);
→ 모든 객체에 공통적으로 적용할 경우에는 인스턴스 변수 말고 클래스 변수로 만들기
→ 객체명.클래스변수명 X / 클래스명.클래스변수명 O
#044 <메소드>
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
// 자동 신고 기능 메소드 만들기 (전달값이 없는 메소드)
void autoReport() {
if (canAutoReport) {
System.out.println("충돌이 감지되어 자동으로 신고합니다.");
} else {
System.out.println("자동 신고 기능이 지원되지 않습니다.");
}
}
// 메모리 카드 삽입 (전달값이 있는 메소드)
void insertMemoryCard(int capacity) {
System.out.println("메모리 카드가 삽입되었습니다.");
System.out.println("용량은 " + capacity + "GB 입니다.");
}
// 저장된 영상 불러오기 (전달값과 반환값이 있는 메소드)
int getVideoFileCount (int type) {
if (type == 1) { // 일반 영상
return 9;
} else if (type == 2) { // 이벤트 영상
return 1;
}
return 10; // 알 수 없는 타입일 경우 전체 영상 개수 반환
}
// 자동 신고 기능 (전달값이 없는 메소드)
b1.autoReport(); // 지원 불가
BlackBox.canAutoReport = true;
b1.autoReport(); // 지원 가능
// 메모리 카드 삽입 (전달값이 있는 메소드)
b1.insertMemoryCard(256);
// 저장된 영상 불러오기 (전달값과 반환값이 있는 메소드)
// 일반 영상 : 1 (type)
// 이벤트 영상 (충돌 감지) : 2 (type)
int fileCount = b1.getVideoFileCount(1); // 일반 영상
System.out.println("일반 영상 파일 수 : " + fileCount + "개");
fileCount = b1.getVideoFileCount(2); // 이벤트 영상
System.out.println("이벤트 영상 파일 수 : " + fileCount + "개");
#045 <메소드 오버로딩>
// 블랙박스 녹화 기능 메소드 만들기
// 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 + "분 단위로 기록됩니다.");
}
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
b1.record(false, false, 10);
System.out.println("-------------------");
b1.record(true, false, 3);
System.out.println("-------------------");
b1.record(true, true, 5);
System.out.println("-------------------");
// 기본값을 설정하고 싶다면? (매번 전달값 입력하지 않고)
b1.record(); // 전달값 입력하지 않는 record 라는 메소드 새롭게 만들기
// 기본값을 설정
void record() {
System.out.println("녹화를 시작합니다.");
System.out.println("영상에 날짜정보가 표시됩니다.");
System.out.println("영상에 속도정보가 표시됩니다.");
System.out.println("영상은 5분 단위로 기록됩니다.");
}
→ 이렇게 할 수도 있지만 비슷한 기능을 하는 메소드를 각각의 코드로 실행하면 유지보수 편의성 떨어짐
void record() {
record(true, true, 5); → 메소드 내에서 메소드 호출한 뒤 전달값 입력
→ b1.record(); 이렇게 쓰면 기본값 입력됨
오늘의 한마디
기본편 끝내고 공부는 쭉 이어서 하고 있었는데 블로그를 한동안 안 썼다. 뭐랄까... 기록을 위한 기록인 것 같고, 코드만 옮겨 적는 게 아니라 설명까지 정리하려면 시간을 너무 잡아먹고... 그래도 아무 기록도 안 남기는 것보다는 낫겠지 생각하며 다시 써본다. 도서관에서 <Do it! 첫 코딩 with 자바>라는 책을 빌렸는데 설명이 엄청 자세하고 친절해서 좋다. 나 같은 제로베이스 왕왕왕초보 수준에 딱이다...! 이거 말고도 <Do it! 점프 투 자바>라는 한 권 더 보고 있다. 그래서 요즘의 공부 루틴은... <첫 코딩>으로 새로 배울 내용 살짝 맛보기 → 강의 들으면서 개념 잡기 → <점프 투 자바>로 복습하기. 같은 내용도 어떻게 설명하는지에 따라 새롭게 느껴진다. 영타는 이제 200타 초반까지는 안정적으로 나온다. 학원 개강 전까지 예습 진도 최대한 빼고 300타 만드는 게 요즘의 목표.
어휴... 나는 왜 손으로 한 번은 써야 머리에 들어오는 걸까...