일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 자바
- 개발공부
- 자바의정석연습문제
- 무료개발강의
- 알고리즘공부
- 코딩공부
- dfs
- 브루트포스
- BFS
- 시간 복잡도
- 자바개념
- 빅오 표기법
- Java개념
- 무료코딩강의
- 다이나믹 프로그래밍
- 자바의정석연습문제풀이
- 백준자바
- 백준
- 백준9단계
- java
- 동적계획법
- 자바의정석
- ★
- ☆
- 알고리즘
- 백트래킹
- dp
- 자바공부
- 백준알고리즘
- 백준단계별로풀어보기
- Today
- Total
더 많이 실패하기
코딩공부 24일차: 프로그래머스 자바 입문 - 7. 상속 본문
#비전공자개발 공부 24일차
프로그래머스 자바 입문 강의를 듣는 중이다
https://school.programmers.co.kr/learn/courses/5
자바 입문
자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금
school.programmers.co.kr
파트7 상속:
상속
상속을 사용하면 부모클래스가 가진 것을 자식클래스가 사용할 수 있다
이클립스에서 상속 받을 클래스를 정하는 방법은 다음과 같다
새 클래스를 만들 때 슈퍼클래스에서 브라우즈를 눌러 상속받고 싶은 클래스를 입력하면
만들어진 클래스에 extends 부모클래스명이 붙어 나온다
슈퍼클래스가 아니라 직접 저 문구를 적어도 상관없다
이후엔 부모클래스에만 있는 메소드를 자식클래스에서도 사용할 수 있다
자식클래스에도 따로 메소드를 만들 수 있는데 이런 걸 확장했다고 표현한다
확장시킨 메소드는 부모 클래스에서 사용할 수 없다
실습에서 machine을 상속받는 car 클래스를 만들라는데 앞에 public을 안 붙여도 성공이라고 떴다
흠..?
파트7 상속:
접근제한자
캡슐화란 관련된 것을 잘 모아서 가지고 있다는 것이다
(각 클래스에 적합한 필드, 메소드만 가지고 있는 것)
접근제한자의 종류
public | 모든 클래스에서 접근 가능 |
protected | 같은 패키지면 접근 가능, 상속 패키지도 접근 가능 |
private | 자기 자신만 접근 가능 |
(공백) | default 같은 패키지면 접근 가능 |
그림과 같이 접근제한자 네 개를 모두 사용해 메소드를 만들었을 때
같은 패키지 내에 만들면 private을 제외하고 모두 사용가능하다
(위에 클래스 선언하고 쓰는 거 잊지 말기)
실습은 다 private때문에 다른 파일에서 사용할 수 없으니 public으로 고치라는 내용이었다
파트7 상속:
추상클래스
새, 음식 등을 말했을 때는 구체적이지 않기 때문에 모든 사람들이 같은 모습을 떠올리기 어렵다
이러한 것들은 추상적이라고 할 수 있는데,
자바에서 이런 추상클래스들은 객체를 가질 수 없다
다시 말해 구체적인 클래스들만 객체를 가질 수 있다
예시처럼 abstract를 붙이고 {}가 아닌 ;로 끝내 추상 메소드를 만들었다면
추상메소드를 하나라도 갖고 있는 클래스라면 앞에 abstrct를 붙여 추상클래스로 만들어줘야 한다
(오타 정정 flt → fly)
추상클래스를 상속받는 자식클래스를 시험할 때, 추상클래스에 있는 메소드(fly)를 사용할 수 있다
왼쪽에 컴파일 에러가 떴듯이 추상클래스는 객체를 생성할 수 없다
파트7 상속:
super와 부모생성자
그림과 같이 car를 상속받는 truck클래스에 기본 생성자를 만들었다
이때 부모클래스인 car에도 저런 기본 생성자가 있을 때
다른 파일에서 truck의 기본생성자를 호출하면 car, truck의 기본생성자가 두 개 모두 출력된다
생성자는 객체를 초기화하는 일을 하는데,
생성자가 호출될 때 자동으로 부모생성자도 함께 호출하면서 부모 객체를 초기화한다
super();는 부모생성자를 의미하는데 저부분을 적지 않더라도 자동으로 부모생성자를 호출하는 것
하지만 super();를 적지 않아도 부모생성자를 호출하는 경우는
그 부모생성자가 기본생성자( () 안이 빈 경우)일 때 뿐이므로 직접 super();를 적어 호출해야 한다
그렇지 않으면 자식생성자도 호출할 수 없다
자식클래스에서 부모의 필드, 메소드를 쓰고 싶을 때도 super를 사용한다
위 실습에서처럼 초기화하고 싶은 대상을 super의 괄호 안에 직접 넣어 지정할 수도 있다
파트7 상속:
오버라이딩
부모클래스의 메소드를 (더 보완하기 위해서 등의 이유로) 자식클래스에서 재정의하는 걸 오버라이딩이라고 한다
위처럼 부모클래스에도 run 메소드가 있고 자식클래스에도 같은 이름의 run메소드가 있으면
메소드를 소환했을 때 자식메소드의 기능을 가져온다
(자식메소드에 그 메소드가 없으면 부모메소드의 기능을 출력한다)
부모의 메소드도 함께 가져오고 싶으면 super.run();를 입력하면 된다
파트7 상속:
클래스 형변환
표시한 부분처럼 부모타입이 자식을 가리킬 수는 있지만
이럴 땐 부모클래스에서 정의한 메소드만 사용할 수 있다
그러나 정수, 실수 데이터 타입에서 보았던 것처럼
부모클래스가 더 상위 개념이기 때문에 자식타입은 부모를 가리킬 수 없다(왼쪽에 컴파일 에러)
이때 클래스도 형변환이 가능하기 때문에
Bus bus = (Bus) c;
라고 하면 자식타입이 부모를 가리킬 수 있다
이후엔 자식클래스에 담긴 메소드도 사용할 수 있다
이것은 처음에 6줄에서 c가 Bus 인스턴스를 참조했기 떄문에 가능한 것이기도 하다
(근데 왜 이렇게 쓰는 거지 의의를 모르겠다)
각각 fill메소드를 정의했지만 중복되는 부분이 매우 많으므로
주석으로 표시한 부분에서 부모클래스인 car를 이용하여 코드의 중복을 줄였다
<<GasStation코드를 살펴보면 3개의 fill메소드가 있습니다. 매개변수로 받아들이는 3종류의 다른 차량에 대해서 기름을 넣어주는 동작을 하는것 뿐인데 3개의 중복된 코드가 들어있어서 비효율적이지요. Car클래스에 있는 gas라는 속성을 공통적으로 사용하므로 이럴경우 fill메소드의 매개변수를 Car로 하면 됩니다. 그러면 Suv, Truck, Bus클래스가 Car클래스로 형변환 되므로 하나의 fill메소드로도 같은 동작을 할 수 있습니다.>>
프로그래머스에서 적은 답안은 위와 같다
확실히 실습이 있으니까 응용도 되고 더 넓게 알아가는 것 같다
'자바' 카테고리의 다른 글
코딩공부 26일차: 프로그래머스 자바 입문 - 8. 인터페이스와 다른 형식의 클래스(2) (0) | 2022.08.26 |
---|---|
코딩공부 25일차: 프로그래머스 자바 입문 - 8. 인터페이스와 다른 형식의 클래스(1) (0) | 2022.08.26 |
코딩공부 23일차: 프로그래머스 자바 입문 - 6. 클래스 다듬기 (0) | 2022.08.23 |
코딩공부 22일차: 프로그래머스 자바 입문 - 5. 클래스와 객체 (0) | 2022.08.22 |
코딩공부 21일차: 프로그래머스 자바 입문 - 4. 배열 (0) | 2022.08.21 |