1)상속(Inheritance)
상속이란?
부모객체가 가지고 있는 속성과 기능을 자식객체한테 물려주는 것이다.
자식객체는 자신만의 속성, 기능과 동시에 부모객체의 속성과 기능을 사용할 수 있다.
연관된 일련의 클래스들에 대한 공통적인 규약을 정의할 수 있다
장점으로 유지보수 및 재사용성이 증가하며 코드길이가 감소한다는 점이 있다.
자바에서는 단일상속만 지원된다
상속의 방법과 표현식
클래스 간의 상속 시에는 extends 키워드를 사용한다.
ex) [접근제한자] class 자식클래스명 extends 부모클래스명 {}
public class Academy extends Company {}
Object Class
모든 클래스의 최상위 부모클래스로 class 선언부에 상속구문이 작성되어 있지 않다면
컴파일러가 자동으로 extends Object 구문을 자동으로 추가해준다
생성자 생성시에 자동으로 작성되는 super(); 는 Object 클래스의 기본생성자이다.
객체의 생성
자식 객체를 생성하게 되면 내부에 부모객체가 먼저 생성된다. 이는 부모생성자 호출, 부모객체 생성, 자식생성자 호출, 자식객체 생성의 순서로 진행되며 때문에 자식객체는 부모객체를 포함하는 형태를 띄게된다.
위의 Object class에서 설명한 super(); 클래스가 자동으로 작성되는 이유도 부모객체 Object의 생성자로서 먼저 생성되기 때문이다
super()와 super.
super() : super 생성자로 부모객체의 생성자를 호출하는 메소드로 첫줄에 존재해야한다
super. : 상속을 통한 자식 클래스 정의 시 해당 자식 클래스의 부모객체를 가르키는 참조변수
오버라이딩(Overriding)
자식클래스가 상속 받은 부모 메소드를 재작성하는 것으로 자식객체를 통한 실행은 재작성한 메소드가 우선권을 가진다
메소드 헤드라인 위에 반드시 Annotation, @Override를 표시해야한다
부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정이 가능하다
자식클래스의 접근범위가 부모클래스의 접근범위보다 넓거나 같아야한다
@Override 어노테이션
해당 메서드가 오버라이딩이 되었음을 컴파일러에게 고지하여 문법체크를 시행하게한다.
부모에게 해당 메서드가 있는지, 이름, 매개변수, 타입과 개수의 동일여부를 체크한다
오버라이딩 성립조건
메소드 이름은 동일해야한다
매개변수의 개수, 타입, 순서가 동일해야한다
리턴 타입은 동일해야한다
private 메소드 오버라이딩은 불가능하다
오버로딩(Overloading)
한 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것이다
메소드 이름은 동일해야하며 매개변수의 개수, 타입, 순서 중 하나는 달라야한다
메소드의 리턴타입은 달라도 상관없다
**print 구문 수행 시 참조변수명을 작성하면 자동으로 toString() 메서드를 호출하여 출력한다
final 예약어
final 클래스 : 상속이 불가능한 클래스 ex) public final class finalClass {}
final 메소드 : 상속 시 오버라이딩이 불가능한 메서드 ex) public final void method() {}
향상된 for문
자바에서 배열, 컬렉션과 같은 데이터를 순차적으로 간단하게 반복할 수 있는 구조를 제공하며 형식은 다음과 같다.
for(데이터타입 변수명 : 배열 또는 컬렉션명){//반복 실행할 코드}
for(Student i : std ){
System.out.println(i.information())
}; //사용한 변수는 아래 예제와 같다
대소문자의 비교
String.toUpperCase(); : 입력된 문자를 대문자로 변환시켜준다
String.toLowerCase(); : 입력된 문자를 소문자로 변환시켜준다
.equalsIgnoreCase(); : 입력된 문자의 대소여부를 구분하지 않고 같은지 확인하다
2)예제풀이
다음은 상속을 이용한 예제풀이다. 조건은 다음과 같다.
링크텍스트
1)Person 클래스
package com.hw1.model.vo;
public class Person {
protected String name;
private int age;
private double height;
private double weight;
public Person() {}
public Person(int age, double height, double weight) {
this.age = age;
this.height = height;
this.weight = weight;
}
public String information() {
return "이름 : " + name + " / 나이 : " + age + " / 신장 : "+height+" / 몸무게 : "+weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
2) Student 클래스
package com.hw1.model.vo;
public class Student extends Person{
private int grade;
private String major;
Person p = new Person();
public Student() {}
public Student(String name, int age, double height, double weight, int grade, String major) {
p.setAge(age);
p.setHeight(height);
p.setWeight(weight);
p.name=name;
this.grade = grade;
this.major = major;
}
public String information() {
return p.information()+" / 학년 : "+grade+" / 전공 : "+major;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
3) Employee 클래스
package com.hw1.model.vo;
public final class Employee extends Person {
private int salary;
private String dept;
Person p = new Person();
public Employee() {}
public Employee(String name, int age, double height, double weight, int salary, String dept) {
p.setAge(age);
p.setHeight(height);
p.setWeight(weight);
p.name=name;
this.salary = salary;
this.dept = dept;
}
public String information() {
return p.information()+" / 급여 : "+salary+" / 부서 : "+dept;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
4) Run 클래스
package com.hw1.run;
import java.util.Scanner;
import com.hw1.model.vo.Employee;
import com.hw1.model.vo.Student;
public class Run {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Student[] std = new Student[3];
Employee[] emp = new Employee[10];
std[0] = new Student("홍길동", 20, 178.2, 70.0, 1, "정보시스템공학과");
std[1] = new Student("김말똥", 21, 187.3, 80.0, 2, "경영학과");
std[2] = new Student("강개순", 23, 167.0, 45.0, 4, "정보통신공학과");
for(int i = 0; i<std.length; i++) {
System.out.println(std[i].information());
}
System.out.println("======================================================");
char result ='y';
do {
for(int i =0; i<emp.length;i++) {
System.out.print("이름 : ");
String name=sc.next();
System.out.print("나이 : ");
int age = sc.nextInt();
System.out.print("신장 : ");
double height = sc.nextDouble();
System.out.print("몸무게 : ");
double weight = sc.nextDouble();
System.out.print("급여 : ");
int salary = sc.nextInt();
System.out.print("부서 : ");
String dept = sc.next();
System.out.print("계속 추가하시겠습니까? (y/n) : ");
result = sc.next().charAt(0);
emp[i]=new Employee(name,age, height, weight, salary, dept );
if(result!='y') {
break;
}
}
if(result!='y') {
break;
}
}while(true);
for(int i = 0; i<emp.length;i++) {
if(emp[i]==null) {
break;
}
System.out.println(emp[i].information());
}
}
}
이후 강사님이 풀이해준 방법과 비교하였을 때 사용되지 않은 여러 문법과 방법이 존재한다. 이클립스 혹은 git에서 강사님의 풀이와 비교해보자.