상속성
클래스 간의 상속?
- 클래스간에는 부모 - 자식의 상속 관계를 설정 가능.
- 부모클래스A를 자식클래스B가 상속 받을 때, B는 A의 모든 멤버변수와 메서드를 자신의 것으로 상속 받음.
(단, private으로 설정된 기능은 상속X) - B는 A의 public, protected 기능들을 직접적으로 코딩하지 않더라고 자신의 것으로 사용가능.
- 두명의 부모에게 상속받는것은 불가능, 한 부모가 여러명의 자식에게 상속가능.
상속 정의 방법
- 'extends'를 입력하여 부모클래스의 이름 명시
public class 자식클래스 extends 부모클래스 {
명 령 어
}
* 부모클래스 작성
public class CalcParent {
public int plus(int x, int y) {
return x+y;
}
public minus(int x, int y) {
return x-y;
}
}
* 자식클래스 작성
부모의 기능 상속 후 곱셈과 나눗셈 추가.
public class CalcChild extends CalcParent {
public int times(int x, int y) {return x*y;}
public int divide(int x, int y) {
int result = 0;
if (y != 0) {
result = x / y;
}
return result;
}
}
* CalcParent와 CalcChild의 활용
public class Main01 {
public static void main(String[] args) {
CaIcParent parent = new CalcParent();
system.out.println(parent.plus(l00, 50));
system.out.println(parent.minus(l00, 50));
System. println("-------------");
CalcChild child = new CaIcChild();
System.out.println(child.plus(200, 100));
System.out.println(child.minus(200, 100));
System.out.println(child.times(200, 100));
System.out.println(chi1d.divide(200, 100));
}
}
// 실행결과
150
50
-------------
300
100
20000
2
다형성
다형성을 구현하기 위한 Override
Override: 부모로부터 상속받은 메서드를 재정의 하는것
class Hello {
public void say() {
System.out.println("Hello");
}
}
class English extends Hello {
}
class Korean extends Hello {
public void say() {
system.out.println("안녕하세요.");
}
}
public class Foo {
public static void main(String[] args) {
English e = new English();
e.say();
Korean k = new Korean();
k.say();
}
}
// 실행결과
Hello
안녕하세요
- 위 소스코드에서 'e.say();' 는 "Hello" 를 찾아가고, 'k.say();' 는 "안녕하세요" 를 찾아간다.
Super 키워드
- 클래스의 상속관계에서 자식클래스가 부모클래스를 가리키는 예약어
- 사용방법
- 멤버변수 이름 앞에 명시
- 부모클래스의 멤버변수를 의미.
- 하지만 부모클래스의 멤버변수는 이미 모두 상속되어 있으므로 이 경우에는 this키워드를 사용한것과 동일한 결과이기에 잘사용하지 않음.
- 메서드 이름 앞에 명시
- 부모클래스의 메서드 의미
- 재정의 되지 않은 메서드 -> 이미 상속되어 있으므로 this키워드를 사용한것과 동일한 결과
- 재정의 된 메서드 -> Override된 메서드이름 앞에 사용하게되면 재정의되기 이전의 원본 메서드 의미.
- 키워드 자체를 메서드처럼 사용
- 부모클래스의 생성자 의미.
- 멤버변수 이름 앞에 명시
Super 키워드 사용예제
class Hello {
public void say() {
System.out.println("Hello");
}
}
class Korean extends Hello {
public void say() {
super.say();
System.out.println("안녕하세요");
}
}
public class Foo {
public static void main(String[] args) {
Korean k = new Korean();
k.say();
}
}
// 실행결과
Hello
안녕하세요
- 위 소스코드에서 'super.say();' 를 통해서 맨위 부모클래스(Hello)의 say()에 접근하여 "Hello" 호출.
Override 옵션
1. 메서드 재정의 과정에서 오타가 발생해도 인정된다.
- 부모클래스의 say()메서드를 재정의 하는 과정에서 실수로 인해 'sai()' 라고 메서드를 추가 했다면
java는 새로운 메서드를 추가했다고 인식하고 에러를 표시하지 않음
class Hello {
public void say() {
System.out.println("Hello");
}
}
class Korean extends Hello {
// 오타발생
public void sai() {
System.out.println("안녕하세요");
}
}
public class Hi {
public static void main(String[] args) {
Korean k = new Korean();
k.sai();
}
}
// 실행결과
안녕하세요
2. 메서드 재정의 과정에서의 오타 방지 옵션
- '@Override' 는 이 키워드가 명시된 위치 아래에 정의되는 메서드가
부모클래스에 존재하지 않을 경우 구문에러로 처리. - 여러 개의 메서드를 재정의 한다면 재정의 되는 모든 메서드들 위에 각기 명시해야 한다.
class Hello {
public void say() {
System.out.println("Hello");
}
}
class Korean extends Hello {
// @Override 입력
@Override
public void sai() {
System.out.println("안녕하세요");
}
}
public class Hi {
public static void main(String[] args) {
Korean k = new Korean();
k.sai();
}
}
// 실행결과
< 에러 발생 >
Overload 옵션
- 원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두 개 이상 존재할 수 없지만,
이를 가능하게 하는 예외적인 처리기법. - 이름이 동일한 메서드를 정의하기 위한 조건
// 메서드간의 파라미터가 서로 달라야 한다.
public void foo(int a) { }
public void foo(long a) { }
// 파라미터의 갯수가 달라야 한다.
public void foo(int a) { ]
public void foo(int a, int b) { }
// 데이터 형의 전달 순서가 서로 달라야 한다.
public void foo(int a, long b) { }
public void foo(long a, int b) { }
객체 생성방법의 다양화
- 생성자 역시 메서드의 한 종류이므로 Overload 가능.
- 생성자를 Overload 할 경우, 해당 클래스에 대해 '객체 생성방법' 을 다양하게 할 수 있다.
public class Member{
private String job;
private int age;
public Member(){ }
public Member(int age){
this.age = age;
}
public Member(String job){
this.job = job;
}
public Member(String job, int age){
this.job = job;
this.age = age;
}
@Override
public String toString() {
return "Member [job=" + job + ", age=" + age + "]";
}
}
'this' 키워드를 사용한 생성자 Overload
- this 키워드의 용법
- 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자 의미
- this 키워드를 사용하여 생성자 Overload를 간결하게 처리
- 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록하여 데이터의 초기화를 한곳에서 처리하도록 구현.
- 생성자 정의하기
public class Article{
private int seq;
private String subject;
private String writer;
public Article(int seq, String subject, String writer){
super();
this.seq = seq;
this.subject = subject;
this.writer = writer;
}
public Article(int seq){
this(seq, "제목 없음", "익명");
}
public Article(int seq, String subject){
this(seq, subject, "익명");
}
@Override
public String toString() {
return "Article [seq=" + seq + ", subject=" + subject + ", writer=" + writer + "]";
}
}
- 생성한 Article 클래스의 기능 확인
public class Main03
{
public static void main(String[] args) {
Article a1 = new Article(1);
System.out.println(a1.toString());
Article a2 = new Article(2, "테스트 게시물");
System.out.println(a2.toString());
Article a3 = new Article(3, "두 번째 게시물", "자바학생");
System.out.println(a3.toString());
}
}
// 실행결과
Article [seq=1, subject=제목 없음, writer=익명]
Article [seq=2, subject=테스트 게시물, writer=익명]
Article [seq=3, subject=두 번째 게시물, writer=자바학생]
'JAVA' 카테고리의 다른 글
JAVA(추상화, 인터페이스) (0) | 2020.06.10 |
---|---|
JAVA(객체형변환, 객체배열) (0) | 2020.06.10 |
JAVA(자바빈즈(Java Beans), 은닉성, 상속성) (0) | 2020.06.09 |
JAVA(클래스, 객체, 생성자) (0) | 2020.06.04 |
JAVA(재귀함수) (0) | 2020.06.04 |
댓글