Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

까마귀코딩.log

백기선 자바스터디 06주차 본문

백기선 자바스터디

백기선 자바스터디 06주차

까마귀코딩 2023. 1. 30. 17:47
더보기
왜? 라는 생각을 달고 살자!

<< 총 15주차 까지 진행되며 주어지는 키워드를 가지고 블로그에 정리하며 공부하는 스터디 입니다 ! >>


 

 

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

 

 


자바 상속의 특징


 

- 클래스의 다중상속을 지원하지 않는다. 

 

- 상속횟수에 제한을 두지 않는다.

 

- 계층구조의 최상위에 java.lang.Object 클래스가 있다.

 

 

 

 

자바에서 모든 클래스는 오브젝트 클래스를 자동으로 상속받도록 설계되어있다. 

그래서 toString(), equals()같은 메소드들을 바로 사용이 가능하다 !

 

 

 

 

상속을 하게되면 어떤 장점이 있을까???

 

1. 코드 재사용, 변수재사용으로 개발시간이 단축 !

2. 먼저 작성된 프로그램 재사용 하기 때문에 신뢰성 있음 !

3. 클래스간 계층분류 및 관리가 가능 ! 유지보수가 편함 !

 

 

 

클래스 상속

상속 선언 어떻게 할까 ? 

부모 클래스를 슈퍼클래스 ,

상속받는 자식 클래스를 서브클래스 라고 한다. 

 

상속을 선언할때는 extends 키워드를 사용한다. 

 

 

 

 

 

상속의 개념 ?? 

캡슐화,추상화,다형성과 더불어 객체지향프로그래밍을 구성하는 특징중 하나입니다.

 

상속이란 원래 있던 클래스의 변수와 메소드를 물려받아서,

새로운 클래스 (더 나은 클래스, 더 구체적인 클래스) 를 만드는것을 의미합니다.

 

 

유전이라고 생각하면 됩니다.

 

 

 

 

 

 

 


super 키워드


 

super 키워드는 부모 클래스로부터 상속받은 필드나 메소드를

자식 클래스에서 참조하는데 사용하는

참조변수 입니다. 

 

 

 

인스턴스 변수의 이름과 지역변수의 이름이 같을경우?

어떻게 할까?

 

 

인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있었습니다. 

이와 마찬가지로 부모클래스의 멤버와 자식클래스의 멤버 이름이 같을경우 

super 키워드를 사용하여 구분할수 있습니다. 

 

 

 

이렇게 자바에서는 super 참조변수를 사용하여서 부모클래스의 멤버에 접근할수 있습니다.

this 와 마찬가지로 super 참조변수를 사용할수 있는 대상도 인스턴스 메소드 뿐입니다. 

클래스 메소드에서는 사용할수 없습니다 !!

 

 

 

 

 

 

 

 

 

 

 

 


메소드 오버라이딩


 

 

오버로딩은 무엇이었나요?

서로 다른 시그니처를 갖는 여러 메소드를

하나의 이름으로 정의하는것 이었습니다.

 

오버라이딩이란 상속 관계에 있는 부모클래스에서

이미 정의된 메소드를 자식클래스에서 같은 시그니처를 갖는 메소드로 다시 정의하는것입니다.

 

 

자바에서 자식클래스는 부모클래스의

private 멤버를 제외한 모든 메소드를 상속받습니다.

 

이렇게 상속받은 메소드는 그대로 사용해도 되고, 

필요한 동작을 위해 재 정의하여 사용할수도 있습니다. 

 

 

즉, 메소드 오버라이딩이란 상속받은 부모클래스의 

메소드를 재 정의하여 사용하는것을 의미합니다. 

 

 

 

 

오버라이딩의 조건?

자바에서 메소드를 오버라이딩 하기위한 조건은 3개입니다. 

 

 

1. 오버라이딩이 메소드 동작만 재 정의하는것이여서, 메소드의 선언부는 기존 메소드와 완전히 같아야 합니다.

 

2. 부모 클래스의 메소드보다 접근제어자를 더 좁은 범위로 변경할수 없습니다. 

 

3. 부모 클래스 메소드보다 더 큰 범위의 예외를 선언할수 없습니다. 

 

 

 

 

 

자바에서는 메소드 오버라이딩을 통해 상속받은 부모클래스의 메소드를 자식클래스에서 

직접 재 정의할수 있습니다. 

 

 

다음 예제는 ,

부모클래스인 parent 클래스의 display() 메소드를 자식클래스인 child 클래스에서 오버라이딩 하는 예제입니다. 

더보기

class Parent {

    void display() { 

System.out.println("부모 클래스의 display() 메소드입니다.");

   }

}

class Child extends Parent {

    void display() {

 System.out.println("자식 클래스의 display() 메소드입니다.");

  }

}

 

public class Inheritance05 {

    public static void main(String[ ] args) {

        Parent p = new Parent();

        p.display();

        Child c = new Child();

        c.display();

        Parent pc = new Child();

        pc.display(); // Child cp = new Parent();

    }

}

더보기

실행 결과 :

 

부모 클래스의 display() 메소드입니다.

자식 클래스의 display() 메소드입니다.

자식 클래스의 display() 메소드입니다.

 

 

 

>>    오버로딩(overloading)은 새로운 메소드를 정의하는 것입니다.

>>    오버라이딩(overriding)은 상속받은 기존의 메소드를 재정의하는 것입니다.

 

 

 

 

 


다이나믹 메소드 디스패치 (Dynamic Method Dispatch)


 

 

메서드 디스패치란 어떤 메서드를 호출할지 결정하여 실제로 실행시키는 과정이다. 

자바는 런타임시 객체를 생성하고, 컴파일 시에는 생성할 객체 타입에 대한 정보만 보유한다. 

 

이에따라 이 과정은 static ( 정적 ) 과 dynamic ( 동적 ) 이 있다. 

 

 

정적 메서드 디스패치(Static Method Dispatch)

 컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고 있는 경우이다.

 

 

 

동적 메서드 디스패치(Dynamic Dispatch)

 

 컴파일러가 컴파일 단계에서 어떤 메소드를 호출할지 모르는 경우이다. 이 경우 런타임 시점에서 컴파일러가 알게 된다.

 

 

 

static dispatch : 컴파일 시점에서, 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고있는 경우이다. ( 정적 )

 

컴파일시 생성된 바이트코드에도 이 정보가 그대로 남아있다. 

런타임 (실행시점) 이 되지 않아도 미리 결정하는 개념이다. 

 

함수를 오버로딩하여 사용하는 경우?

인자의 타입이나 리턴타입 등에따라 어떤 메서드를 호출할지 알수있는경우이다. 

 

 

dynamic dispatch :  정적 디스패치와 반대.

컴파일러가 어떤 메서드를 호출할지 모르는 경우이다. 

동적 디스패치는 호출할 메서드를 런타임 시점에서 결정한다. 

 

 

인터페이스나 추상클래스에 정의된 추상메소드를 호출하는 경우다. 

인터페이스 또는 추상클래스로 선언하고 구현/상속받은 하위 클래스의 인스턴스를 생성한다. 

컴파일러가 알고있는 타입에 대한 정보를 토대로 런타임시 해당 타입의 객체를 생성하고 메소드를 호출한다. 

 

 

double dispatch : dynamic dispatch 를 두번 하는걸 의미한다. 

 

방문자 패턴 - 여러 객체에 대해 각 객체의 동작들을 지정하는 패턴 ( N:N )

 

일반적으로 oop는 객체가 스스로 행위를 수행하게 하는것 !!!

 

 

하지만 경우에 따라 객체의 행위 수행을 외부 클래스에 위임한다. 

이때 사용하는 디자인패턴 종류는 전략패턴, 커맨드패턴, 방문자패턴

 

더블디스패치는 방문자 패턴과 밀접한 관계에 있다. 

 

 

 

 

 

 


추상 클래스


 

추상클래스 ?????????

 

 

왜쓰는걸까 왜?

 

 

1. 추상클래스가 뭘까 ? 개념?

 

 

각자의 필드와 메서드가 있을것이다. 

추상클래스는 A클래스, B클래스, C클래스들 간에 비슷한 필드와 메서드를 공통적으로 추출해 만들어진 클래스다.

 

 

 

1. 추상클래스는 뭐? 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

 

 

 

2. 추상클래스는 객체를 생성할 수 없다! 아직은 실체성이 없고 구체적이지 않기 때문에!

 

 

 

3. 추상클래스와 실체클래스는 어떤관계? 상속관계!

 

 

 

추상클래스를 왜사용할까??? 크게 3가지

 

 

1. 공통된 필드와 메서드를 통일할 목적

 

2. 실체클래스 구현시, 시간절약

 

3. 규격에 맞는 실체클래스 구현

 

 

 

 

 

여기서 추상클래스의 강력한 기능이 나온다.

추상클래스를 상속받은 실체클래스들은 반드시!! 추상메서드를 재정의(오버라이딩)해서 실행 내용을 작성해야 한다.

만약 그렇지 않으면?? 컴파일 에러를 발생시켜 실행조차 못하게 막는다

 따라서, 코더들은 강제적으로 추상메서드를 구현해야한다.

여기서 추상메서드라는 것이 갑자기 나왔는데, 추상클래스 안에 abstract 키워드를 가지고 있는 메서드는

== 추상메서드라고 하고, 상속시 반드시 재정의해야하는 메서드라는 뜻이다.

 

 


final 키워드


1. Final 변수

 

-변수를 final 로 선언하면 한번 초기화된 변수는 변경불가능한 상수값이 된다 !

 

 

2. 메서드 인자에 final 붙이기

 

- 메서드에 final 붙이면 메서드 안에서 변수값을 변경할수 없어진다 !

 

 

3. final 클래스 

 

- 클래스에 final 을 선언하면 상속 자체가 안된다 !

그냥 그대로 사용해야해

 

 

--> 보안때문에 사용한다. 

상속이라는게 기능을 수정하려고 하는건데

수정하면 안되는 경우 상속을 못하게 하려고 사용하는것이다. 

 

 

주로 라이브러리 개발시 사용한다. 

 

 

 

 


Object 클래스


object는 자바의 클래스를 선언할때 extends 키워드로 다른클래스를 상속하지않으면

암시적으로 java.lang.object 클래스를 상속하게된다. 

 


object 클래스는 필드가없고 메소드로 구성되어 있다. 

 

이 메소드들은 모든 클래스들이 옵젝 클래스를 상속하기 때문에 아무데서나 이용할수 있다 !

 

 

 Object클래스 대표 메소드 종류
- equals() 메소드 : 
두 객체가 동일한 객체라면 true를 리턴하고, 다르다면 false를 리턴합니다.
- hashCode() 메소드 : 
객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴한다.
객체마다 다른값을 가지고 있다.
- toString() 메소드 : 객체의 문자 정보를 리턴한다. 즉, 객체를 문자열로 표현한다.

 

-----

object class 이용한 생성 

object obj = new obj();