Java 객체 지향 프로그래밍 - 1

2023. 4. 1. 10:41·📘 Backend/Java
목차
  1. 📘 상속 (extends 키워드)
  2. 포함 관계
  3. 메소드 오버라이딩
  4. Super & Super()
  5. 📘 Object 클래스
  6. 📘 캡슐화 & 패키지 & import & 접근제어자
  7. 패키지
  8. import
  9. 📘 Getter & Setter

📘 상속 (extends 키워드)

  • 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소
  • 코드의 중복 제거

상위클래스의 속성인 name,age / 기능인 learn,wlak,eat 를 상속받은 하위클래스들

img


클래스 상속 예시

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 클래스의 포함관계라고 볼 수 있다.

img


메소드 오버라이딩

  • 상위 클래스로부터 상속받은 메소드와 동일한 이름의 메소드 재정의

ex)

Bike 클래스가 Vehicle 클래스의 run() 메소드를 오버라이딩 하는 예시

img


오버라이딩 사용의 3가지 조건

  • 메소드의 선언부(메소드이름,매개변수,반환타입)이 상위클래스의 것과 완전히 일치해야한다
  • 접근제어자의 범위가 상위클래스의 메소드보다 같거나 넓어야함
  • 예외는 상위클래스의 메소드보다 많이 선언할 수 없다.

img

img


Super & Super()

super = 상위 클래스의 객체 호출
super() = 상위 클래스의 생성자 호출

공통적인 부분은 둘 다 상위 클래스의 상속 관계를 전제로 함


super

상위 클래스인 Upper의 변수인 count를 Lower가 상속받았으나 변수명이 같으므로 super로 구분

img


super()

super 는 무조건 생성자 안에서만 사용가능하며, 첫줄에 와야함

img


📘 Object 클래스

  • 자바의 클래스 상속계층도에서 최상위에 위치한 상위클래스
  • 자바의 모든 클래스틑 Object 클래스로부터 확장된다는 명제는 항상 true
  • javac 는 아무런 상속을 받지 않는 클래스에 자동으로 extends Object를 추가하여 Object를 상속 받게함
class ParentEx { // 컴파일러가 자동으로 "extends Object" 추가
}

class ChildEx extends ParentEx {
}

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

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

캡슐화의 목적

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

패키지

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

import

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

### 접근제어자

크게 접근 제어자와 기타 제어자로 분류한다.


img


img


public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)

img


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
  1. 📘 상속 (extends 키워드)
  2. 포함 관계
  3. 메소드 오버라이딩
  4. Super & Super()
  5. 📘 Object 클래스
  6. 📘 캡슐화 & 패키지 & import & 접근제어자
  7. 패키지
  8. import
  9. 📘 Getter & Setter
'📘 Backend/Java' 카테고리의 다른 글
  • Java Enum
  • Java 객체 지향 프로그래밍 - 2
  • Java This & Inner Class
  • Java Constructor
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      React #Markdown
      Lock #Thread #Concurrency
      GStreamer #Pipeline
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Java 객체 지향 프로그래밍 - 1
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.