📘 상속 (extends 키워드)
- 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소
- 코드의 중복 제거
상위클래스의 속성인 name,age / 기능인 learn,wlak,eat 를 상속받은 하위클래스들
클래스 상속 예시
class Person {
String name;
int age;
void learn(){
System.out.println("공부를 합니다.");
};
void walk(){
System.out.println("걷습니다.");
};
void eat(){
System.out.println("밥을 먹습니다.");
};
}
class Programmer extends Person { // Person 클래스로부터 상속. extends 키워드 사용
String companyName;
void coding(){
System.out.println("코딩을 합니다.");
};
}
class Dancer extends Person { // Person 클래스로부터 상속
String groupName;
void dancing(){
System.out.println("춤을 춥니다.");
};
}
class Singer extends Person { // Person 클래스로부터 상속
String bandName;
void singing(){
System.out.println("노래합니다.");
};
void playGuitar(){
System.out.println("기타를 칩니다.");
};
}
public class HelloJava {
public static void main(String[] args){
//Person 객체 생성
Person p = new Person();
p.name = "김코딩";
p.age = 24;
p.learn();
p.eat();
p.walk();
System.out.println(p.name);
//Programmer 객체 생성
Programmer pg = new Programmer();
pg.name = "박해커";
pg.age = 26;
pg.learn(); // Persons 클래스에서 상속받아 사용 가능
pg.coding(); // Programmer의 개별 기능
System.out.println(pg.name);
}
}
포함 관계
- 상속처럼 클래스 재사용, 클래스의 멤버로 다른 클래스 타입의 참조변수 선언
- 클래스간의 관계에서 상속 or 포함 관계를 맺어줄것인지에 대한 판별 방법
- 클래스 간의 관계가 '
은 ~이다(Is - a)' 관계인지 '은 ~을 가지고있다(Has - a)' 관계인지 문장을 만들어 생각해보자 - ex) Employee는 Address를 가지고 있다 가 말이 되므로 포함관계라고 할 수 있다.
- 클래스 간의 관계가 '
ex) 예시에서 Address 클래스가 Employee 클래스의 포함관계라고 볼 수 있다.
메소드 오버라이딩
- 상위 클래스로부터 상속받은 메소드와 동일한 이름의 메소드 재정의
ex)
Bike 클래스가 Vehicle 클래스의 run() 메소드를 오버라이딩 하는 예시
오버라이딩 사용의 3가지 조건
- 메소드의 선언부(메소드이름,매개변수,반환타입)이 상위클래스의 것과 완전히 일치해야한다
- 접근제어자의 범위가 상위클래스의 메소드보다 같거나 넓어야함
- 예외는 상위클래스의 메소드보다 많이 선언할 수 없다.
Super & Super()
super = 상위 클래스의 객체 호출
super() = 상위 클래스의 생성자 호출
공통적인 부분은 둘 다 상위 클래스의 상속 관계를 전제로 함
super
상위 클래스인 Upper의 변수인 count를 Lower가 상속받았으나 변수명이 같으므로 super로 구분
super()
super 는 무조건 생성자 안에서만 사용가능하며, 첫줄에 와야함
📘 Object 클래스
- 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스
- 자바의 모든 클래스틑 Object 클래스로부터 확장된다는 명제는 항상 true
- javac 는 아무런 상속을 받지 않는 클래스에 자동으로 extends Object를 추가하여 Object를 상속 받게함
class ParentEx { // 컴파일러가 자동으로 "extends Object" 추가
}
class ChildEx extends ParentEx {
}
📘 캡슐화 & 패키지 & import & 접근제어자
- 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호
캡슐화의 목적
- 데이터 보호
- 내부 데이터의 불필요한 외부 노출
- 즉, 캡슐화의 가장 큰 핵심은 정보은닉
패키지
- 특정한 목적을 공유하는 클래스와 인터페이스의 묶음
- 클래스 충돌 방지
- ex) java.lang.String
import
- 다른 패키지 내의 클래스를 사용하기 위해 사용
- 일반적으로 패키지와 클래스 사이에 작성
import 패키지명.클래스명; 또는 import 패키지명.*;
### 접근제어자
크게 접근 제어자와 기타 제어자로 분류한다.
public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)
Parent 클래스의 멤버인 a,b,c,d는 모두 정상 출력이 됨. why? 같은 클래스 내부에 있기 때문
Test 클래스에서 Parent 객체를 생성하여 접근할때는 a인 private 은 접근이 불가능
package package1; // 패키지명 package1
//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
System.out.println(p.b);
System.out.println(p.c);
System.out.println(p.d);
}
}
public class Parent { // Parent 클래스의 접근 제어자는 public
private int a = 1; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
int b = 2;
protected int c = 3;
public int d = 4;
public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
Child 클래스는 1번쨰 패키지의 Parent클래스를 상속받았지만 c,d만 출력이 됨
Test2 클래스는 상속받은 클래스가 아니기 때문에 a,b,c 에는 접근이 불가능하고 public인 d에만 접근가능하다
package package2; // package2
//파일명 Test2.java
import package1.Parent;
class Child extends package1.Parent { // package1으로부터 Parent 클래스를 상속
public void printEach() {
// System.out.println(a); // 에러 발생!
// System.out.println(b);
System.out.println(c); // 다른 패키지의 하위 클래스
System.out.println(d);
}
}
public class Test2 {
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // public을 제외한 모든 호출 에러!
// System.out.println(p.b);
// System.out.println(p.c);
System.out.println(p.d);
}
}
📘 Getter & Setter
캡슐화의 목적을 달성하면서 데이터의 변경이 필요한 경우
Rombok을 이용하여 @Getter, @Setter 어노테이션으로 많이 사용한다.
getter
- 설정한 변수 값을 읽어오는데 사용하며, 메소드명 앞에 get- 을 붙여서 사용
setter
- 외부에서 메소드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해주며, 메소드명에 set- 을붙여서 정의
public class GetterSetterTest {
public static void main(String[] args) {
Worker w = new Worker();
w.setName("김코딩");
w.setAge(30);
w.setId(5);
String name = w.getName();
System.out.println("근로자의 이름은 " + name);
int age = w.getAge();
System.out.println("근로자의 나이는 " + age);
int id = w.getId();
System.out.println("근로자의 ID는 " + id);
}
}
class Worker {
private String name; // 변수의 은닉화. 외부로부터 접근 불가
private int age;
private int id;
public String getName() { // 멤버변수의 값
return name;
}
public void setName(String name) { // 멤버변수의 값 변경
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 1) return;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
// 출력값
근로자의 이름은 김코딩
근로자의 나이는 30
근로자의 ID는 5
'📘 Backend > Java' 카테고리의 다른 글
Java Enum (0) | 2023.04.01 |
---|---|
Java 객체 지향 프로그래밍 - 2 (0) | 2023.04.01 |
Java This & Inner Class (0) | 2023.04.01 |
Java Constructor (0) | 2023.03.31 |
Java Static (0) | 2023.03.31 |
열심히 살고 싶은 사람의 메모장
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!