나도코딩 자바 심화편_3일차(24.12.20)
#050 <접근 제어자>
*접근 제어자
-private: 해당 클래스 내에서만 접근 가능
-public: 모든 클래스에서 접근 가능
-default: 아무것도 적지 않았을 때 / 같은 패키지 내에서만 접근 가능
-protected: 같은 패키지 내에서 / 다른 패키지일 경우 자식 클래스에서 접근 가능
public String modelName; → public (모든 클래스에서 접근 가능)
String resolution; → default (같은 패키지 내에서만 접근 가능)
private int price; → private (이 클래스 내에서만 접근 가능)
protected String color; → protected (같은 패키지 내에서/다른 패키지일 경우 자식 클래스에서 접근 가능)
*참고)
// getter & setter 간단하게 만들기
→ Menu - Code - Generate - Getter and Setter = 자동 생성
// 일괄 수정 기능
→ BlackBox 드래그하고 ctrl + c - ctrl + r
정리
→ getter 와 setter 같은 메소드, 생성자에도 접근 제어자 적용 가능
→ 외부에서 사용 허용할지 막을지 결정할 수 있음
→ 자바 파일 내에는 클래스 여러 개 정의할 수 있음
→ public 클래스로 정의하는 경우 클래스명과 자바 파일명이 일치해야 함
→ 캡슐화 (Encapsulation): 서로 연관된 것들만 같은 캡슐에 담기(하나의 클래스로 정의)
→ 정보 은닉 (Information Hiding): 아무나 건드리지 못하도록 정보 숨기기 / 객체에서 허용하는 형태(허용하는 메소드 통해서만)로만 접근 가능하게 함
#051 <패키지>
*패키지
자바 클래스들을 서로 연관된 것들끼리 묶어주는 폴더
package chap_08;
import chap_07.BlackBox;
import chap_07.BlackBoxRefurbish;
→ import: 다른 패키지에 있는 클래스 사용하기
import chap_07.*;
→ * 붙이면 해당 패키지에 있는 모든 클래스 사용할 수 있음
// 이미 만들어진 클래스를 가져다 쓸 수 있음
// 예시) 랜덤 클래스
Random random = new Random();
→ random 이라는 객체 생성해서 사용
System.out.println("랜덤 정수 : " + random.nextInt());
→ int의 범위 내에서 정수값
System.out.println("랜덤 정수 (범위) : " + random.nextInt(10));
→ 0 이상 10 미만의 정수값
System.out.println("랜덤 실수 : " + random.nextDouble());
→ 0.0 이상 1.0 미만의 실수값
// 5.0 이상 10.0 미만의 실수값 랜덤으로 얻고 싶다면? (int 처럼 범위 지정할 수 없음)
double min = 5.0;
double max = 10.0;
System.out.println("랜덤 실수(범위) : " + (min + (max - min) * random.nextDouble()));
// boolean 값도 랜덤 가능
System.out.println("랜덤 boolean : " + random.nextBoolean());
// 로또 번호를 랜덤으로 뽑으려면? (1~45)
System.out.println("로또 번호 : " + (random.nextInt(45) + 1));
→ nextInt(45) : 0 이상 45 미만의 수
→ nextInt(45) + 1 : 1 이상 46 미만의 수 = 1 이상 45 이하의 수
// 자바에서 제공하는 여러 가지 클래스
→ Math, Scanner, StringBuilder, StringBuffer, StringTokenizer
→ BigInteger, BigDecimal
→ LocalDate, LocalTime, LocalDateTime, DateTimeFormatter 등...
#052 <상속>
*상속
부모 클래스에서 제공되는 모든 것을 자식 클래스에서 가져다 쓰는 것
카메라 클래스
public class Camera { → 부모 클래스
public String name;
public Camera() {
this.name = "카메라";
}
// 카메라가 가지는 기본 기능 메소드 만들기
public void takePicture() {
// 사진 촬영
System.out.println(this.name + " : 사진을 촬영합니다.");
}
public void recordVideo() {
// 동영상 녹화
System.out.println(this.name + " : 동영상을 녹화합니다.");
}
과속 단속 카메라 클래스
public class SpeedCam extends Camera { → 자식 클래스
→ 상속 : 자식 클래스명 extends 부모 클래스명
// public String name;
→ 상속 후에는 지워도 됨
→ 따로 선언할 필요 없이 부모 클래스에 정의되어 있는 name 그대로 사용
*참고)
// 자동 생성자 만들기
→ alt + insert
public SpeedCam() {
this.name = "과속 단속 카메라";
}
<기본 기능 메소드> (상속 후에는 지워도 됨)
public void takePicture() {
// 사진 촬영
System.out.println("사진을 촬영합니다.");
}
public void recordVideo() {
// 동영상 녹화
System.out.println("동영상을 녹화합니다.");
}
// 추가 기능 메소드 (상속 후에도 유지)
public void checkSpeed() {
// 속도 체크
System.out.println("속도를 측정합니다.");
}
public void recongnizeLicensePlate() {
// 번호 인식
System.out.println("차량 번호를 인식합니다.");
}
공장 카메라 클래스
public class FactoryCam extends Camera { → 자식 클래스
// 상속 : 자식 클래스명 extends 부모 클래스명
// public String name;
→ 상속 후에는 지워도 됨
→ 따로 선언할 필요 없이 부모 클래스에 정의되어 있는 name 그대로 사용
public FactoryCam() {
this.name = "공장 카메라";
}
<기본 기능 메소드> (상속 후에는 지워도 됨)
public void takePicture() {
// 사진 촬영
System.out.println("사진을 촬영합니다.");
}
public void recordVideo() {
// 동영상 녹화
System.out.println("동영상을 녹화합니다.");
}*/
<추가 기능 메소드> (상속 후에도 유지)
public void detectFire() {
// 화재 감지
System.out.println("화재를 감지합니다.");
}
새로운 클래스
public class _12_Inheritance {
public static void main(String[] args) {
Camera camera = new Camera();
→ camera 변수 생성해 Camera 클래스 가져오기
FactoryCam factoryCam = new FactoryCam();
→ factoryCam 변수 생성해 FactotyCam 클래스 가져오기
SpeedCam speedCam = new SpeedCam();
→ speedCam 변수 생성해 SpeedCam 클래스 가져오기
// 이름 정보 출력
System.out.println(camera.name);
System.out.println(factoryCam.name);
System.out.println(speedCam.name);
// 사진(동영상) 촬영
camera.takePicture();
factoryCam.recordVideo();
speedCam.takePicture();
// 추가 기능
factoryCam.detectFire();
speedCam.checkSpeed();
speedCam.recongnizeLicensePlate();
정리
→ 모든 카메라에 똑같은 코드 반복해서 입력하면 비효율적이고 유지 보수도 어려워짐
→ 상속을 이용해 기본 기능 그대로 가져다 쓰고, 추가 기능만 새로 만들기 (코드 간결해짐)
→ 부모 클래스 : 기능을 물려주는 클래스
→ 자식 클래스 : 기능을 물려받는 클래스
→ 상속은 하나의 부모 클래스로부터만 가능 (여러 부모에게 상속 X)
오늘의 한마디
패키지 개념 배운 뒤로 여러 클래스를 왔다갔다하면서 실습하다 보니 오늘 공부한 내용을 요약하는 게 복잡해진다... 어차피 복습은 인텔리제이 파일 보면서 하고, 추가 공부는 책 보면서 하니까 블로그 정리에 너무 힘 빼지 말아야지. 나중에 검색할 일 생길 때를 대비해서 중요한 키워드들만 놓치지 말고 적어둬야겠다. 오늘 배운 내용들은 큰 무리 없이 이해했는데 계속계속 새로운 걸 배우니까 전에 배웠던 것들을 까먹는다. 다들 코딩은 외워서 하는 게 아니라고, 암기할 필요 없다고 하는데... 내가 느끼기엔 왜 이렇게 외울 게 많은 것 같지? 강의 들을 때는 다 알 것 같은데 혼자 해보라고 하면 하나도 못 할 것 같아서 불안한 마음이 든다. 일단 완강을 목표로 쭉 달리고 계속 반복해서 보자...!
'공부를 하자! > 나도코딩 자바 심화편' 카테고리의 다른 글
[나도코딩 자바 심화편] 2일차: 클래스 메소드, This, 생성자, Getter와 Setter (1) | 2024.12.20 |
---|---|
[나도코딩 자바 심화편] 1일차: 클래스, 인스턴스 변수, 클래스 변수, 메소드, 메소드 오버로딩 (1) | 2024.12.19 |