공부를 하자!/나도코딩 자바 심화편

[나도코딩 자바 심화편] 1일차: 클래스, 인스턴스 변수, 클래스 변수, 메소드, 메소드 오버로딩

kimchopchop 2024. 12. 19. 12:25

나도코딩 자바 심화편_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타 만드는 게 요즘의 목표.
 

어휴... 나는 왜 손으로 한 번은 써야 머리에 들어오는 걸까...