SEB_BE 13일차 - Java객체지향심화1

subimm_·2022년 9월 6일

코드스테이츠

목록 보기
14/83

💡 오늘의 학습목표

  • 상속
  • 캡슐화

📔 상속

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소

  • 하위 클래스는 상위 클래스가 가진 모든 멤버 상속

  • ~ 클래스로부터 확장되었다. / 하위클래스의 멤버 개수는 상위 클래스보다 같거나 많다.

  • 자바는 단일 상속만을 허용함.

  • 상속 정의

class Programmer extends Person //Person 클래스로부터 상속 
  • 상속 예제
class Person {
	String name;
    
    void eat(){
    	System.out.println("밥먹기");
    };
}
class Programmer extends Person {// Person 클래스로부터 상속
	void coding(){
    	System.out.println("코딩하기");
    };
}

public class HelloJava {
	public static void main(String[] args){
    
    //person 객체 생성
    Person p = new Person();
    p.name = "홍길동"
    p.eat();
    System.out.println(p.name);
    
    //Programmer 객체 생성
    Programmer pg = new Programmer();
    pg.name = "김철수" // 상속받은 필드
    pg.eat(); //상속받은 메서드
    pg.coding() // 개별 메서드
    System.out.println(pg.name);
  }
}
// 출력
밥먹기
홍길동
밥먹기
코딩하기
김철수

📖 포함 관계

  • 클래스의 멤버로 다른 클래스 타입의 참조변수 선언
  • 대다수는 상속 보다는 포함관계를 사용

    상속 관계 : ~은 ~ 이다 (IS-A)
    포함 관계 : ~은 ~ 을 가지고 있다 (HAS-A)

📖 메서드 오버라이딩

  • 상위 클래스로부터 상속받은 메서드와 같은 이름의 메서드를 재정의하는 것

    오버라이딩이 되는 조건

    1. 메서드의 선언부(메서드명,매개변수,반환타입)이 상위클래스의 메서드와 일치
    2. 접근제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
    3. 예외는 상위클래스의 메서드보다 많을 수 없다.
    class Car {
    	void stop() {
        	System.out.println("Car stop");
        }
    }
    public class SportsCar extends Car { // Car 클래스로부터 상속
    	void stop() {
        	System.out.println("SportsCar stop");// 메서드 오버라이딩
        }
        public static void main(String[] args) {
        	SportsCar car = new Car();
            car.stop();
        }
    }// "SprotsCar stop"

📖 super / super()

  • super - 상위 클래스의 객체
  • super() - 상위 클래스의 생성자 호출
    모두 상위 클래스의 존재를 상정하고 상속 관계를 전제로 한다.
    super 사용 예제
public class Super {
    public static void main(String[] args) {
        Lower a = new Lower();
        a.callNum();
    }
}

class Upper {
    int count = 10; // super.count
}

class Lower extends Upper {
    int count = 5; // this.count 구별 필요

    void callNum() {
        System.out.println("count = " + count); //가장 가까운 
        System.out.println("this.count = " + this.count);
        System.out.println("super.count = " + super.count);
    }
} //출력
count = 5
count = 5
count = 10

super() 사용 예제

  • super() 메서드도 생성자 안에서만 사용 가능, 반드시 첫 줄에 위치
  • 모든 생성자의 첫 줄에는 반드시 this() 또는 super()가 선언되어야 함.
  • 컴파일러가 자동으로 생성해주지만 클래스를 만들 때 기본 생성자를 생성해야함.
public class Test {
    public static void main(String[] args) {
        Singer s = new Singer();
    }
}

class Person {
    Person() {
        System.out.println("사람 클래스 생성자");
    }
}

class Singer extends Person { // Person 클래스로부터 상속
    Singer() {    
        super(); // Person 클래스의 생성자 호출
        System.out.println("가수 클래스 생성자");
    }
}

📖 Object 클래스

  • Object클래스는 최상위에 위치한 상위클래스.

  • 아무 상속도 받지 않는 클래스에 자동적으로 추가됨.

  • Object 클래스의 대표 메서드

    • toString() = 객체 정보를 문자열로 출력
    • equals(Object obj) = 등가 비교 연산(==) 과 동일하게 스택 메모리값을 비교
    • hashCode() = 객체의 위치정보 관련, 해쉬테이블 또는 해쉬맵에서 동일 객체여부

📔 캡슐화

  • 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호
  1. 데이터 보호의 목적
  2. 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출 방지

📖 패키지

  • 특정한 목적을 공유하는 클래스와 인터페이스의 묶음.
  • 계층 구조 간 구분은 . 으로 표현
  • 패키지가 있는 경우 소스코드의 첫 줄에 반드시 packge 패키지명 표시
    (패키지 선언이 없으면 이름없는 패키지에 속함)
  • 클래스의 충돌 바지 (같은 이름의 클래스를 가질 경우)
package practicepkg.test; //패키지 구문 포함

public class PackageEx {
}

📖 import문

  • 다른 패키지 내의 클래스를 사용하기 위해 사용 (패키지문과 클래스문 사이에 작성)
  • 매번 패키지명을 붙일 필요 없어짐.
  • 컴파일시에 처리되어 프로그램의 성능에는 영향을 주지 않음.
import 패키지명.클래스명; 또는 import 패키지명.*;

import 패키지명.* = 해당 패키지의 모든 클래스 사용

📖 접근 제어자

  • 제어자 = 접근 제어자 / 기타 제어자(static, final, abstract...)
  • 접근 제어자는 하나만 사용 가능 / 기타 제어자는 여러번 사용 가능
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 = 10; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
    int b = 20;
    protected int c = 30;
    public int d = 40;

    public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

📖 getter / setter 메서드

  • 캡슐화를 하면서도 데이터의 변경이 필요한 경우
  • private 접근제어자가 포함되어 있는 객체의 변수 데이터 값을 추가/수정 하고 싶을때
  • setter 메서드 : 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값 변경 가능 (메서드는 공개)
    일반적으로 메서드명에 set-을 붙여서 정의
  • getter 메서드 : 이렇게 설정한 변수 값을 읽어오는데 사용
    일반적으로 메서드명에 get-을 붙여서 정의
  • alt + insert 자동완성

회고

오늘은 학습전에 객체지향개념 파트가 어렵게 느껴져서 자바의정석 강의를 빠르게 듣고 학습을 했다. 아무것도 모른채로 공부하는 것보다 훨씬 이해가 잘되었다. 객체지향 파트는 여러 부가적인 학습자료로 더 공부해보아야 할 것 같다.

profile
코린이의 공부 일지

0개의 댓글