2022. 10. 3. 00:15ㆍjava일지
2022/10/01
- 학습내용
1.상속(Inheritance)
상속은 왜 사용하는걸까?
상속은 공통적인 속성이나 기능들을 부모클래스에만 지정해놓고 다른 클래스에서 간편하게 사용하기 위해서다.
프로그래밍 상속의 개념을 실생활의 은행 계좌를 통해 쉽게 설명할 수 있다.
계좌는 종류가 엄청 많다.
처음 입출금 계좌를 만들고 사람들의 상황에 따라 주택청약, 주식전용, 외화저축 등 수많은 계좌들을 생성한다.
이름과 기능들은 다르지만 계좌들의 기본적인 속성은 공통적으로 가지고 있다.
그 공통속성을 계좌를 만들때마다 하나하나 입력하는 것이 아니라 기본이 되는 계좌에서 공통속성은 똑같이 불러온다.
계좌마다의 추가적인 특성은 공통속성 밑에 따라 생성한다.
이 공통적인 속성들은 각 계좌마다 수정 사항이 생길 수 있다.
다시 프로그래밍 개념으로 넘어와서 비유를 해보면 계좌는 부모 클래스
주택청약, 주식전용, 외화저축 등 계좌의 공통 속성을 받은 계좌들은 자식 클래스라고 부른다.
부모 클래스는 객체 간의 상속 관계에서 상속을 해주고, 자식 클래스는 그 상속을 받는 것이다.
class 부모클래스 extends 자식클래스
extends 를 연결해주면 클래스 간 상속 관계가 형성된다.
자식 클래스 내부에 별도로 정의해주지 않아도
부모 클래스에 정의된 멤버변수와 메서드를 그대로 이어 받아 사용할 수 있게된다.
1) 오버로딩(Overloading - 과적)
java에서 과적은 하나의 메서드 이름으로 여러 기능을 구현한다는 뜻이다.
오버로딩은 부모 클래스에서 상속받은 메서드에서 파라미터를 변경하여 새로운 메서드를 정의한다.
부모 클래스의 메서드명은 그대로 사용한다. -> 즉 새로운 메서드를 정의하는 것이다.
오버로딩 조건
1. 메서드의 이름이 같아야한다.
2. 매개변수의 개수나 타입이 달라야 한다.
주의 : return 값만 다른 것은 오버로딩을 할 수 없다.
또한 접근 제어자도 자유롭게 지정해 줄 수 있다.
각 메서드의 접근 제어자를 public, default, protected, private으로 다르게 지정해줘도 상관없다.
결국 오버로딩은 매개변수의 차이로만 구현할 수 있다는 것이다.
매개변수가 다르다면 리턴 값은 다르게 지정할 수 있다.
2) 오버라이딩(Overriding - 덮어쓰기)
부모 클래스에서 상속받은 메서드의 내용을 자식 클래스의 상황에 맞게 변경해서 재정의한다.
자식 클래스가 부모 클래스를 상속하여 자식에게 없는 메서드를 호출하면 부모클래스에 가서 해당 메서드를 찾게 된다.
만약 부모 클래스의 메서드를 자식클래스에서 동일한 이름으로 다시 재정의하면 부모클래스의 메서드를 찾지 않고
자식 클래스의 메서드를 호출하게 된다. 이것이 오버라이드(재정의)
부모 클래스의 파라미터 설정을 그대로 따른다.
오버라이딩 조건
1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 한다.
하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있다.
2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.
public class 부모클래스 {
public void overridingEx() {
System.out.println("부모 메서드 내용");
}
}
class 자식클래스 extends 부모클래스 {
//Override
public void overridingEx() {
System.out.println("상속받은 부모 메서드 내용을 수정하여 자식 메서드의 내용으로 사용");
}
}
※단점
자식 클래스에서 부모클래스를 오버라이드하면 부모 클래스의 메서드는 사용할 수가 없다.
super.
위의 단점때문에 super 키워드가 나왔다.
super. 는 자식 클래스에서 부모 클래스의 메서드를 사용하고자 할 때 사용한다.
public Bus(int busNum) {
super.StartOperation("차고지행");
super.number = busNum;
super.fuelvolume = 100;
super.speed = 0;
super.maxPassenger = 30;
super.price = 1000;
System.out.println(busNum + "번 버스가 생성되었습니다.");
@Override
public int getNumber() {
return super.getNumber();
}
@Override
public void setNumber(int number) {
super.setNumber(number);
}
2.접근제어자(Access Modifier)
접근 제어자는 용어 그대로 클래스, 멤버 변수, 메서드, 생상자 등에 대한 접근을 제한하는 역할을 한다.
public static void main(String[] args) {
}
public 같은 제어자는 선언부에 함께 사용되어 부가적인 의미를 부여하는 역할을 한다.
접근 제어자 | 클래스 | 패키지 | 상속 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
public
public는 접근 제한이 전혀 없다.
다른 클래스에서도 접근할 수 있고, 다른 패키지에서도 접근할 수 있다.
한 프로젝트 어느 곳에서든 접근이 가능하다.
protected
protected는 패키지에 관계없이 상속관계에 있는 자식 클래스에서 접근할 수 있다.
상속관계에 있다면 어디서든 접근 가능하다. 패키지도 넘나들 수 있다.
default
아무런 접근 제어자를 붙이지 않았다면 자동으로 default로 적용된다.
한 패키지 내에서 모두 접근이 가능하다.
상속관계에서 패키지를 넘나들 수 있는 protected보다 더 좁은 범위이다.
private
가장 강도 높은 제한이다.
private은 한 클래스 안에서만 접근 가능하다.
클래스 외부에서 직접 접근할 수 없어서 데이터를 보호하는 것에 용이하다.
private은 보안과 관련되어 쓰인다.
굳이 공개될 필요가 없는 시스템 내부의 값들을 가리는 데에 주로 사용된다.
정보 일부를 가린다 해서 정보은닉(캡슐화)라고 한다.
Getter/Setter 메서드
Getter :필드의 값을 외부로 리턴해주는 메서드
Setter : 외부에서 값을 받아 필드를 변경하는 메서드
3.인터페이스
인터페이스는 설계 이전의 클래스다.
메서드의 이름과 파라미터, 반환 형식만 가질 뿐 실제 구현부는 가질 수 없다.
클래스처럼 인스턴스를 생성하는 것도 불가능하다.
인터페이스는 기능의 표준화를 달성하도록 하는 도구다.
공통 기능을 일정한 단위로 인터페이스로 묶어 처리한 다음 이를 구현할 클래스에서 각 업무 로직에 맞게 구현할 수 있다.
만약 여러 클래스에 걸쳐 신규 기능이 생기거나 삭제 기능이 있다면
인터페이스라는 표준화 도구를 통해 효율적인 코드 작성이 가능해진다.
메서드 구현은 implements 를 사용하여 별도의 클래스 파일에서 해주어여 한다.
class savingsAccount extends BankAccount implements Withdrawable { // 자유입출금통장
boolean isOverdraft; // 마이너스 통장 여부
public void withdraw() { } // 예금 인출 - 인터페이스 구현부
void transfer() { } // 계좌 송금
}
- 참고자료
항해99 spring 입문학습
'java일지' 카테고리의 다른 글
프로그래밍 기초탄탄#6 인스턴스 멤버와 정적 멤버 (0) | 2022.10.04 |
---|---|
프로그래밍 기초탄탄#5 java- ==, equals (0) | 2022.10.03 |
프로그래밍 기초탄탄#3 java-객체지향이란? (0) | 2022.10.02 |
프로그래밍 기초탄탄#2 java-class (0) | 2022.09.29 |
프로그래밍 기초탄탄#1 java-자료형,연산자, 조건문,반복문 (0) | 2022.09.25 |