Day15

dokiru·2023년 2월 20일
0

학원

목록 보기
13/51

퀴즈 피드백

  • 공통으로 관리해줘야하는 값은 정적 필드 선언!
    ex. 병사들을 관리하는데 공격력과 방어력은 똑같아야한다면 정적 필드 선언
  • 필드가 static이면 그걸 다루는 메소드도 static
System.out.printf("획득 금액: $%.2f(%.0f원)", dollar, won);
// 표시하고싶은 소수점자리까지 서식문자열 사이에 넣어준다
  • 로직을 짤 때 잘못된 케이스를 맨 위에서 필터링한 후에 그 밑으로는 조건에 맞는 값만 들어온다고 생각하고 코드를 작성하는 것 good

상속(Inheritance)

: 부모가 자식에게 물려주는 행위

  • 자식은 상속을 통해서 부모가 물려준 것을 자연스럽게 이용할 수 있다 (필드, 메서드)

  • 예외
    : 부모와 자식이 다른 패키지에 있는 경우, default 권한을 갖는 필드와 메서드
    : private 권한을 갖는 필드와 메서드

클래스의 상속

class 자식클래스 extends 부모클래스 {
	// 필드
    // 생성자
    // 메서드
}
  • 다중 상속은 허용되지 않는다! (오직 부모클래스 하나로부터만)

부모 생성자의 호출

  • 자식을 생성하려면 부모를 먼저 생성해야 한다
  • super()를 통해 부모의 생성자를 먼저 호출한 후에 자식 생성자를 호출한다
  • 부모 생성자에 매개변수가 있다면 명시적으로 호출해줘야하고, 아니면 생략 가능(컴파일러에서 자동으로 생성)
  • 부모 생성자는 자식 생성자의 맨 첫줄에서 먼저 호출됨
  • 부모의 인스턴스가 미리 형성되었어도 자식 생성시에 부모 생성자가 무조건 호출됨 ( 부모 생성 -> (부모 생성 + 자식 생성) )

ex.

public class People { // 부모 클래스
	public String name;
    public String ssn;
    
    public People(String name, String ssn) {
    this.name = name;
    this.ssn = ssn;
    }
}

public class Student extends People { // 자식 클래스
	public int studentNo;
    
    public Student(String name, String ssn, int studentNo) {
    super(name, ssn); // 부모생성자 호출 명시
    this.studentNo = studentNo;
    }
}

public class StudentExample {
	public static void main(String[] args) {
    Student student = new Student("홍길동", "12334-12234", 1);
    // 부모에게서 물려받은 필드 출력
    System.out.println("name : " + student.name);
    System.out.println("ssn : " + student.ssn);
    // 자신이 가지고 있는 필드 출력
    System.out.println("studentNo : " + student.studentNo);
    }
}

메소드 재정의(@Override)

  • 상속된 메소드의 내용이 자식 클래스에 맞지 않을 경우 자식 클래스에서 동일한 메소드를 재정의하는 것을 의미
  • 규칙
  1. 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 리스트)를 가져야 한다. -> 시그니처들을 수정하면 아예 다른 메소드
  2. 접근 제한을 더 강하게 오버라이팅 할 수 없다 (부모는 public인데 자식은 private이면 X)
  • 오버라이딩 시에 오버라이딩한 메서드 위에 @Override 를 붙여주는 것이 좋다
    : 컴파일러가 정확하게 오버라이딩했는지 체크해주고, 오버라이딩한 메서드임을 명시할 수 있음

부모 메소드의 호출(super)

  • 메소드가 오버라이딩 되었다면 자식 객체에서 호출할 때 부모 객체의 메서드는 숨겨짐
  • 하지만 부모 객체의 메소드를 호출할 일 있으면 명시적으로 super 키워드와 도트연산자를 붙여서 사용한다
  • super는 부모의 객체를 참조하고 있기 때문에 부모 메서드 호출 가능
super.부모메서드명();

final 클래스와 final 메서드

  • final 변수와 비슷하다
  • final 클래스 : 상속할 수 없는 final 클래스 -> 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다
  • final 메서드 : 자식에 의해 오버라이딩 될 수 없다

protected 접근 제한자

  • public과 default 접근 제한의 중간쯤
  • 같은 패키지 : default처럼 제한 없음
  • 다른 패키지 : 자식 클래스만 접근 허용 (super을 통해 부모 생성자 호출)
  • 필드와 생성자, 메소드 선언에 사용될 수 있다

ArrayList

  • 자바 컬렉션 중 하나
  • 실무에서 많이 활용, 효율적인 활용, 동적인 사이즈 변환
  • 향상된 for문 사용 가능, 객체 담아서 사용 가능
  • 사용 예시
import java.util.ArrayList; // import한 후에 사용

ArrayList<String> seasons = new ArrayList<>();
seasons.add("봄");
seasons.add("봄");
seasons.add("봄");
seasons.add("여름");
seasons.add("가을");
seasons.add("겨울");

// 하나 읽어오기
seasons.get(0); // arr[0] arr[1] arr[2]

// 여러개 읽어오기
for (int i=0; i<seasons.size(); i++) { // length같은 역할 => size
	System.out.println(seasons.get(i) + " " + i);
}
// 결과
봄 0
봄 1 
봄 2 
여름 3
가을 4
겨울 5

seasons.remove("봄"); // 3개의 봄 중에 가장 첫번째 값을 삭제
// 여러개 읽어오기
for (int i=0; i<seasons.size(); i++) { // length같은 역할 => size
	System.out.println(seasons.get(i) + " " + i);
}

// 결과
봄 0
봄 1 
여름 2
가을 3
겨울 4
profile
안녕하세요!

0개의 댓글