객체지향 프로그래밍 기술 - 상속, 은닉, 다형성
> 상속 inheritance
extends 상속받을클래스명
객체 지향 언어에서의 상속은 기존 클래스를 확장하여 새로운 클래스를 이끌어내는 것
여러 개의 클래스가 같은 기능(코드)를 필요로 할 때, 이것을 한 클래스에서 작성 후 여러 개의 클래스에게 상속
코드 재사용으로 반복작업을 줄일 수 있음
[상속해주는 클래스 = 부모 클래스 (parent / super class)] → [상속받는 클래스 = 자식 클래스 (child / sub class)]
멤버변수와 메소드가 상속되며, 생성자는 상속되지 않음
단일 상속만 지원함
*자바의 모든 클래스는 Object 클래스를 상속받고 있음 (Object 클래스는 자바의 최상위 클래스)
//만들고 싶은 클래스1
public class Student {
String name;
int age;
String studentId;
String info() {
return "이름: " + name + ", 나이: " + age;
}
}
//만들고 싶은 클래스2
public class Teacher {
String name;
int age;
String subject;
String info() {
return "이름: " + name + ", 나이: " + age;
}
}
//공통 부분: 멤버변수 name, age, 메소드 info
//각각의 고유한 부분: Student 클래스의 멤버변수 studentId, Teacher 클래스의 멤버변수 subject
//부모클래스
public class Person {
String name;
int age;
String info() {
return "이름: " + name + ", 나이: " + age;
}
}
//자식클래스1
public class Student extends Person { //상속받음
String studentId;
}
//자식클래스2
public class Teacher extends Person { //상속받음
String subject;
}
//student 클래스의 main 클래스
public class MainClass {
Student s = new Student(); //객체생성
s.name = "홍길동";
s.age = 20;
s.studentId = "123123";
System.out.println( s.info() );
}
> 오버라이딩 overriding - 메소드 재정의
부모클래스에서 상속받은 메소드를 자식클래스에서 다시 정의하여 사용하는 것
부모클래스에서와는 다르게 사용하기 위해 바꾸거나 보완
오버라이딩 이후 자식클래스에서 메소드를 호출하면 재정의된 메소드가 호출됨
재정의된 메소드는 우선적으로 실행됨
- 규칙 -
1. 상속을 전제로 함
2. 메소드의 이름, 반환유형, 매개변수 선언이 기존 메소드와 완전히 일치
3. 접근제한자는 같거나 더 제한이 없어야 함
//부모클래스
public class Parent {
void method1() {
System.out.println("부모의 1번 메소드");
}
void method2() {
System.out.println("부모의 2번 메소드");
}
}
//자식클래스
public class Child extends Parent {
void method2() { //오버라이딩, 메소드 이름/반환유형/매개변수 동일하게 작성
System.out.println("부모의 2번 메소드 재정의"); //메소드 내용 변경
}
void method3() {
System.out.println("자식의 3번 메소드");
}
}
//main 클래스
public class MainClass{
Child c = new Child();
c.method1(); //상속받은 메소드
c.method2(); //오버라이딩 된 메소드
c.method3(); //자식클래스의 고유한 메소드 (자식클래스에서 정의된 메소드)
//위의 상속 예제 오버라이딩
public class Student extends Person {
String studentId;
String info() {
return "이름: " + name + ", 나이: " + age + ", 학번: " + studentId; //내용 추가
}
}
> 오버로딩 overloading - 메소드 중복
메소드/생성자의 중복 선언
메소드/생성자를 선언할 때 이름은 같게, 매개변수 유형/ 개수 / 순서를 다르게 선언하는 것
하나의 메소드로 매개 변수의 유형에 따라 다른 동작이 실행됨
- 조건 -
1. 이름이 같아야 함
2. 매개변수의 유형 / 개수 / 순서가 달라야 함
3. 상속 여부, 접근제한자, 반환유형 무관
//안되는 예 - 반환유형은 void와 int로 서로 다르지만, 매개변수 유형과 개수가 동일
void input(int a) {
System.out.println("정수 입력");
}
int input(int b) {
return b;
}
//되는 예
void input(int a) {
System.out.println("정수 입력");
}
void input(int a, int b) { //매개변수의 개수가 다름
System.out.println("정수 두개 입력");
}
void input(double b, String s) { //매개변수의 종류가 다름
System.out.println("실수 하나, 문자열 하나 입력");
}
void input(String s, double b) { //매개변수의 순서가 다름
System.out.println("문자열 하나, 실수 하나 입력");
}
//main 클래스
public class MainClass {
public static void mian(String[] args) {
Basic b = new Basic();
b.input(5); //매개변수 입력을 메소드에 맞게 하면 됨
b.input(1, 2);
b.input(3.14, "응");
b.input("가", 1.23);
}
}
'course 2021 > JAVA' 카테고리의 다른 글
day12 - access modifier, encapsulation (0) | 2021.09.02 |
---|---|
day11 - this, super (0) | 2021.08.31 |
day09 - package (0) | 2021.08.30 |
day08 - class (0) | 2021.08.29 |
day07 - method (0) | 2021.08.25 |