1. 상속
상속이란???
상속이란 새로운 클래스를 작성할 때 기존에 존재하는 클래스를 물려받아 사용할 수 있다.
이때 자신의 멤버를 물려주는 클래스를 부모 클래스 또는 조상 클래스라고 한다.
또한 상속받는 클래스를 자식 클래스 또는 자손 클래스라고 한다.
왜 써야하는가???
클래스가 가진 멤버를 물려받기 때문에 새롭게 작성해야 할 코드의 양이 줄어든다.
어떻게 써야하는가???
새롭게 작성할 클래스 선언 부분 뒤에 extends + 부모 클래스 이름을 붙인다.
주의할 점 : 상속은 하나의 부모에게서만 가능하다.
📋 코드
package chapter07;
class Person
{
void breath()
{
System.out.println("숨쉬기");
}
void eat()
{
System.out.println("밥먹기");
}
void say()
{
System.out.println("말하기");
}
}
class Student extends Person
{
void learn()
{
System.out.println("가르치기");
}
}
class Teacher extends Person{
void teach()
{
System.out.println("가르치기");
}
}
public class ch07_1
{
public static void main(String[] args)
{
Student s1 = new Student();
s1.breath();
s1.learn();
Teacher t1 = new Teacher();
t1.eat();
t1.teach();
}
}
📕 해설
모든 클래스는 main 으로 부터 시작한다.
1. main 함수에서는 s1이라는 변수에 Student 클래스의 인스턴스를 생성한다.
2. Student 클래스엔 breath 함수가 들어있지 않아 Student의 부모 클래스인 Person에서 찾게되고 부모 클래스에 있는 breath 함수가 실행된다.
3. 다음 구문 s1.breath(); 에서는 Student 클래스에 rearn 함수가 있기 때문에 자식 클래스의 learn 함수가 실행된다.
4. t1 변수에 Teacher 클래스의 인수턴스를 생성한다.
5. Teacher 클래스에서 eat 함수가 들어있지 않아 부모클래스 Porson 클래스에 eat 함수가 실행된다.
6. Teacher 클래스의 teach 함수가 실행된다.
👨🏻💻 결과
숨쉬기
가르치기
밥먹기
가르치기
2 . 오버라이딩
오버라이딩이란???
오버라이딩은 자손 클래스에서 부모 클래스로부터 물려받은 메서드를 다시 작성하는 것을 말한다.
왜 써야하는가???
부모로부터 메서드를 상속받았지만 자손 클래스에서는 부모와는 다르게 동작해야 할 때도 있기 때문이다.
주의할점 : 오버라이딩을 할 때는 부모 클래스의 메서드와 선언부가 일치하는 메서드를 작성해야 한다.
3. 상속과 생성자
(1) super()
super()
부모 클래스의 생성자 호출은 상위 클래스를 의미하는 super() 라는 생성자를 호출해주어야한다.
📋 코드
package chapter07;
class Car2
{
int wheel;
int speed;
String color;
Car2(String color)
{
this.color =color;
}
}
class SportsCar extends Car2
{
int speedLimit;
SportsCar(String color, int speedLimit)
{
super("red");
this.color = color;
this.speedLimit = speedLimit;
}
}
public class ch07_2 {
public static void main(String[] args) {
SportsCar sportsCar1 = new SportsCar("red", 330);
System.out.println(sportsCar1.color);
System.out.println(sportsCar1.speedLimit);
}
}
📕 해설
1. sportsCar1 변수에 SprtsCar 클래스의 인스턴스를 생성한다.
2. 가지고갈때 red,330 이라는 인자값을 가지고 SportsCar 클래스에 SportsCar 생성자의 매개변수에 전달한다.
3. super 생성자로 부모클래스의 생성자를 자동 호출하며 red 인자값을 전달한다.
4. 부모클래스 생성자에서 매개변수 값을 부모클래스의 전역변수에 대입한다.
5. 자식클래스의 생성자에서 매개변수 값 speedLimit 를 자식클래스 전역변수에 대입한다.
6. 부모클래스의 color와 자식클래스의 speedlimit 가 출력된다.
(2) Object 클래스
Object 클래스는 모든 클래스의 조상인 클래스이다.
어떤 클래스라도 상속 관계를 따라 거슬러 올라가면 마지막에는 Object 클래스가 있으며 누구에게도 상속받지 않는다.
4.Package와 import
(1) Package
패키지란???
패키지란 클래스를 모아놓은 일종의 폴더이다.
규모가 큰 작업을 할 때는 상당히 많은 클래스를 사용한다.
유지보수 및 관리를 용이하게 하기 위해서 클래스끼리 묶어서 분리하는 일종의 디렉토리이다.
(2) import
다른 패키지에 있는 클래스를 사용하고 싶을때는 import를 해야한다.
만약 import를 사용하지 않는다면
packageA.PacA pratice = new packageA.PacA();
이런식으로 앞에 참조를 해줘야한다.
5. 제어자
제어자란???
클래스나 멤버의 사용을 제어하기 위해 사용한다.
제어자의 종류는 접근 제어자와 static, final 등이 있다.
접근 제어자 | |
public | 접근 제한이 없음 |
protected | 같은 패키지 내에서와 자손 클래스에서 접근 가능 |
default | 같은 패키지 내에서만 접근 가능 |
private | 같은 클래스 내에서만 접근 가능 |
📋 코드
package chapter07;
class User
{
public String name;
public int age;
User(String name, int age)
{
this.name = name;
this.age = age;
}
//getter / setter
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 class ch07_3
{
public static void main(String[] args)
{
User user1= new User("철수",20);
User user2= new User("영희",19);
System.out.println(user1.name+"의 나이는 " + user1.age);
user2.age = 99;
System.out.println(user2.name+"의 나이는 " + user2.age);
}
}
📕 해설
1. user1 변수에 User 클래스의 인스턴스를 생성하며 철수,20 인자값을 가지고 User 클래스 매게변수에 전달한다.
2. User 클래스의 User 생성자에서 매개변수로 받은 철수,20 인자값을 name과 age 전역변수에 대입한다.
3. "철수의 나이는 20" 가 출력된다
4. user2 변수에 User 클래스의 인스턴스를 생성하며 영희,19 인자값을 가지고 User 클래스 매게변수에 전달한다.
5.User 클래스의 User 생성자에서 매개변수로 받은 영희,19 인자값을 name과 age 전역변수에 대입한다.
6. "영희의 나이는 99" 가 출력된다
◎ vrivate 을 사용할 경우
package chapter07;
class User
{
private String name;
private int age;
User(String name, int age)
{
this.name = name;
this.age = age;
}
//getter / setter
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 class ch07_3
{
public static void main(String[] args)
{
User user1= new User("철수",20);
User user2= new User("영희",19);
System.out.println(user1.getName()+"의 나이는 " + user1.getAge());
user2.setAge(99);
System.out.println(user2.getName()+"의 나이는 " + user2.getAge());
}
}
📕 해설
만약 보안상의 이유로 vrivate 를 사용할 경우 직접접근이 불가능 하기 때문에
getName 메서드를 구현하여야한다.
'Java > 단계별 과정' 카테고리의 다른 글
[JAVA] 예외 처리(Exception Handing) (0) | 2023.05.03 |
---|---|
[JAVA]추상 메서드와 추상 클래스 (0) | 2023.05.02 |
[JAVA]자바 기본 총정리 (0) | 2023.04.25 |
[JAVA]오버로딩과 생성자 (0) | 2023.04.25 |
[JAVA] 배열과 클래스 객체지향 (1) | 2023.04.21 |