우주먼지
article thumbnail

💡 상속 (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를 상속 받게함

 

ex)

class ParentEx { // 컴파일러가 자동으로 "extends Object" 추가
}

class ChildEx extends ParentEx {
}

💡 캡슐화 & 패키지 & import & 접근제어자

  • 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호

 

캡슐화의 목적

  • 데이터 보호
  • 내부 데이터의 불필요한 외부 노출
  • 즉, 캡슐화의 가장 큰 핵심은 정보은닉

 

패키지

  • 특정한 목적을 공유하는 클래스와 인터페이스의 묶음
  • 클래스 충돌 방지
  • ex) java.lang.String

 

import

  • 다른 패키지 내의 클래스를 사용하기 위해 사용
  • 일반적으로 패키지와 클래스 사이에 작성
import 패키지명.클래스명; 또는 import 패키지명.*;

 

접근제어자

크게 두가지로 분류
public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > 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);
    }
}

Parent 클래스의 멤버인 a,b,c,d는 모두 정상 출력이 됨. why? 같은 클래스 내부에 있기 때문

Test 클래스에서 Parent 객체를 생성하여 접근할때는 a인 private 은 접근이 불가능

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);
    }
}

Child 클래스는 1번쨰 패키지의 Parent클래스를 상속받았지만 c,d만 출력이 됨

Test2 클래스는 상속받은 클래스가 아니기 때문에 a,b,c 에는 접근이 불가능하고 public인 d에만 접근가능하다


💡 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

 

 

'Languages > Java' 카테고리의 다른 글

심화 학습 Reference  (0) 2022.09.07
공부해야 할 Class & Method  (0) 2022.09.06
Constructor & this & Inner Class  (0) 2022.09.05
클래스 & 객체 & 필드 & static & 메소드  (0) 2022.09.02
배열  (0) 2022.09.01
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그