수업 11일차(상속, 캡슐화)

Rina's·2023년 4월 25일

코드스테이츠

목록 보기
83/96
  • 상속
  • 포함
  • 오버라이딩
  • super
  • super()
  • 캡슐화
  • 패키지
  • 접근제어자
  • getter
  • setter

🍄상속

상위 클래스로 부터 맴버(필드, 메서드, 내부클래스)확장
공통 속성, 기능에 대한 코드 중복 제거

class [자손] extends [부모] {}

java 객체지향 프로그래밍은 단일상속만을 허용한다
다중상속 기능은 인터페이스로 커버

상속 vs 포함

클래스의 멤버로 다른 클래스 타입의 참조변수를 선언하는 것

다음은 Car클래스가 Engine클래스를 포함하는 예시이다

public class Main {
    public static void main(String[] args) {
   
        Engine Gear = new Engine("four"); 
        //Engine 초기화(엔진 모델 : four)
        Car car = new Car("tico", Gear);
		//Car 초기화(브랜드명 : tico, 엔진: Gear)
        car.start();
        //Engine 메서드 사용
    }
}
class Engine {
    String model;
    public Engine(String model) {
        this.model = model;
    }
    public void start() {
        System.out.println("Starting engine...");
    }
}
class Car {
    String brand;
    Engine engine;    //Engine 선언
    public Car(String brand, Engine engine) {
    //Car생성자에 Engine 타입을 할당
        this.brand = brand;
        this.engine = engine;
    }
    public void start() {
        engine.start();
        System.out.println("Starting car...");
    }
}
/*output
Starting engine...
Starting car...
  1. Engine engine; 선언
  2. Car class 생성자내 Engine engine를 인수로 받아 초기화
  3. Engine.start() 메서드 사용

상속과 포함의 구분방법
is 관계인지 has 관계인지 확인 할 것

메서드 오버라이딩

상속받은 메서드의 재 정의 조건

  1. 메서드 선언부(메서드 이름, 매개 변수, 반환 타입)가 일치 할 것
  2. 접근 제어자가 같거나 클 것
  3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.

super vs super()

.super

조상의 객체를 참조(.this와 비슷한 역할)
조상과 자손의 맴버명이 같을 때 super키워드가 없다면
컴파일러는 자신이 속한 객체의 멤버를 먼저 참조

super()

조상의 생성자 호출(this()와 비슷한 역할)
첫 줄에 super()를 자동으로 추가해 줌
모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 한다

Object class

모든 클래스의 최상의 클래스
모든 클래스에 자동으로 extends Object가 추가된다
대표적인 Object의 메서드 : toString(), equals(), hashCode()...

🍍캡슐화

인스턴스 내부 속성과 기능을 캡슐(접근제한)로 만들어 데이터 를 보호, 은닉

패키지

특정 목적의 클래스, 인터페이스 묶음
물리적 단위의 디렉토리(directory)

첫 줄에 package [패키지명] 작성, 없을시 이름없는 패키지에 속하게 됨
같은 이름의 클래스의 충돌을 방지해 준다

계층을 .으로 구분
String 클래스의 정식명칭 java.lang.String

대표적인 기본 패키지

java.lang java 기본클래스
java.util java 확장클래스
java.io java.nio java 입출력클래스

Import

import 패키지명.클래스명; 또는 import 패키지명.*;

다른패키지 클래스 간편한 사용을 위해 작성
타 패키지의 클래스 사용시 패키지 구문을 생략하게 해줌
패키지 구문과 클래스 구문 사이에 작성

접근제어자

제어자

클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드
제어자는 여러개를 쓸 수 있다
기타 제어자들 static, final, abstract, native..

private : 클래스내
default : 패키지내
protected : 패키지내 + 자손클래스
public : 접근제한 없음

setter getter

privat 맴버.사용으로 바로 호출이 안되니까
public 메서드를 넣어 (할당)set하거나 (호출)get 하는 것

public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        //System.out.println("근로자의 이름은 " + w.name); 바로 호출 안됨
      
        System.out.println("근로자의 이름은 " + w.getName());
        //get으로 호출        
       
        w.setName("박코팅");
        System.out.println("근로자의 이름은 " + w.getName());
        //set으로 변경후 get으로 호출
       
        String name = w.getName();
        System.out.println("근로자의 이름은 " + name);
        //name을 만들어 호출
    }
}
class Worker {
    private String name = "정코팅"; // 변수의 은닉화. 외부로부터 접근 불가
    public String getName() { // 멤버변수의 값
        return name;
    }
    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }
}
/*output
근로자의 이름은 정코팅
근로자의 이름은 박코팅
근로자의 이름은 박코팅

🙄 생각할 점

class apple {
    int price = 100;

    public void buy() {
        int price = 200;
    }
}

필드내의 인스턴스변수와 매서드 내의 지역변수가 이름이 같게되는 경우가 있다.
이름이 같더라도 이 둘은 다른 변수이기 때문에 메서드에서 아무리 다른값을 할당해도 인스턴스변수의 값이 달라지지 않는다. 간단히 말하면
필드값 this.data != 메소드값 data 로 다른 값이 나오게 된다
메소드 내에서 price = 200;이 아닌 int price = 200; 이라는 것에 집중하자

🦃🦃🦃

Math.floor(fee * 10) / 10; 소수 첫째자리 반올림하기

하루에 한개씩 java기초 단계에 심화실습 프로그램 만들기를 하나씩 해보고 있다. 어제는 텍스트스타크래프를 만들었고 오늘은 전기요금계산기를 만들었다
이름은 스타였는데 내용물은 롤이였다. 너무 옛날게임이라 모르는 사람이 많을거라 생각해 바꾼걸까ㅋㅋ
일어나는 시간을 좀더 당기고 싶은데 쉽지가 않다..

profile
갭린이 리나

0개의 댓글