2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[TIL] Java 2024.07.30

2024. 7. 30. 19:37ㆍ코딩

상속

1.클래스 간의 관계와 상속

- 객체 지향 프로그램에서도 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
- 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 
  변경이 쉬워질 수도 있다
- 이러한 특성 때문에 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가하여 생산성과 유지 보수성에
  매우 유리하다.
  • 상속
    • 클래스 간의 상속은 extends 키워드를 사용하여 정의할 수 있다.
      ex) public class 자식 클래스 extends 부모클래스 { }

123
1. 부모 클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.

 

  • 부모 클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.
  • 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다
  • 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나
    많았다

 

 

 

 

 

  • 클래스 간의 관계
    • 상속 관계 : is -a ("~은 ~(이)다.")
    • 포함 관계 : has ~ a ("~은 ~ 을(를) 가지고 있다.")
  • 단일 상속과 다중 상속
    • Java는 다중 상속을 허용하지 않는다.
    • 다중 상속을 허용하면 클래스 간의 관계가 복잡해지는 문제가 생기기 때문.
  • Object
    • Object는 말 그대로 "객체"를 의미하는 단어이며 보통, Object 클래스를 의미합니다.
    • Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스이다.
    • 모든 클래스는 Object의 메서드를 사용할 수 있다.
    • 또한 부모가 없는 자식 클래스는 컴파일러에 의해 자동으로 Object 클래스를 상속받게 된다.
Object 클래스 메서드 몇가지!
- Object clone() : 해당 객체의 복제본을 생성하여 반환
- boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환
- Class getClass() : 해당 객체의 클래스 타입을 반환.
- int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환함
- String toString() : 해당 객체의 정보를 문자여로 반환함 & Object 클래스에서는 클래스 이름 @해쉬코드 값 리턴

 

2. 오버라이딩

부모 클래스로부터 상속받은 메서드의 내영을 재정의 하는 것을 오버라이딩이라고 한다.

- 부모 클래스의 메서드를 그대로 사용 가능하지만 자식 클래스의 상황에 맞게 변경을 해야 하는 경우 오버라이딩을 사용
- 오버라이딩을 하기 위해서는 조건을 만족해야 한다.
1. 선언부가 부모 클래스의 메서드와 일치해야 한다.
2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.
3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없다.
  • super 와 super()
    • super는 부모 클래스의 멤버를 참조할 수 있는 키워드
      • 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용될 수 있다.
      • 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 
        이를 구분하기 위해 사용된다.
    • super()는 부모 클래스의 생성자를 호출할 수 있는 키워드
      • 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출하기 위해 사용 될 수 있다.
      • 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성된다.
      • 이때 부모 클래스의 멤버들이 초기화 작업이 먼저 수행이 되어야 한다.
        • 따라서 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출된다
        • 또한 부모 클래스의 생성자는 가장 첫 줄에서 호출이 되어야 한다

3. 다형성

  • 참조 변수의 타입 변환
    • 자동 타입 변환
      • 부모 타입 변수 = 자식 타입 객체; 는 자동으로 부토 타입으로 변환이 일어난다.
      • 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급될 수 있다.
        • 다만 주의할 점은 부모 타입 변수로 자식 객체의 멤버에 접근할 때는 부모 클래스에 선언된 즉,
          상속받은 멤버만 접근 가능
    • 강제 타입 변환
      • 자식 타입 변수 = (자식 타입) 부모 타입 객체;
        • 부모 타입 객체는 자식 타입 변수로 자동으로 타입 변환되지 않습니다.
        • 이럴 때는 타입 변환 연산자를 사용하여 강제로 자식 타입으로 변환할 수 있다.
          • 다만 무조건 강제 타입으로 변환을 할 수 있는 것은 아니다.
            • 자식 타입 객체가 부모 타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때만 
              강제 타입 변환이 가능하다.
            • 부모 타입 변수로는 자식 타입 객체의 고유한 멤버를 사용할 수 없기 때문에 사용이 필요한
              경우가 생겼을 때 강제 타입 변환을 사용한다.
          • 이렇게 자동 타입 변환된 부모 타입 변수가 아닌 부모 객체를 자식 타입의 변수로
            강제 타입 변환하려고 하면 오류가 발생한다.
    • 다형성이란?
      • 여러가지 형태를 가질 수 있는 능력을 의미한다
        • 참조 변수 타입 변환을 활용해서 다형성을 구현할 수 있다.
    • instanceof
      • 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어가 instance of 이다.
        • 이 명령어를 통해서 해당 객체가 내가 의도하는 클래스의 객체인지 확인할 수 있다.
        • {대상 객체} instance of {클래스 이름} 과 같은 형태로 사용하면 응답값은 boolean이다.

4. 추상 클래스

  • 추상 클래스란? 
    • 클래스가 설계도라면 추상 클래스는 미완성된 설계도이다.
      • abstarct 키워드를 사용하여 추상 클래스를 선언할 수 있다
        ex) public abstract class 추상  클래스명 { }
    • 추상 클래스는 추상 메서드를 포함할 수 있다.
      • 추상 메서드가 없어도 추상 클래스로 선언할 수 있다.
    • 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.
    • 추상 클래스는 여러 개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있다.
  • 추상 메서드
    • 추상 메서드는 아직 구현되지 않은 미완성 메서드이다.
      • abstarct 키워드를 사용하여 추상 메서드를 선언할 수 있다.
        ex ) public abstract class 추상 클래스명 { 
              abstract 리턴타입 메서드이름(매개 변수, .....); }
      • 추상 메서드는 일반적인 메서드와는 다르게 블록{} 이 없다.
        • 즉 정의만 할 뿐, 실행 내용은 가지고 있지 않는다.
  • 추상 클래스 상속
    • 추상 메서드는 extends 키워드를 사용하여 클래스에서 상속된다.
      ex ) public class 클래스명 extends 추상 클래스명 {
                   @override
                   public 리턴 타입 메서드이름(매개변수, ....) {
                   }
              }
    • 상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 한다.

인터페이스

1. 인터페이스의 역할

  • 인터페이스는 두 객체를 연결해 주는 다리 역할을 해준다.
  • 상속 관계가 없는 다른 클래스들이 서로 동일한 행위 즉, 메서드를 구현해야 할 때 인터페이스는
    구현 클래스들의 동일한 사용 방법과 행윌르 보장해 줄 수 있다.
    • 인터페이스는 스팩이 정의된 메서드들의 집합이다.
    • 인터페이스의 구현 클래스들은 반드시 정의된 메서드들을 구현해야 한다.
    • 구현 클래스들의 동일한 사용 방법과 행위를 보장해 줄 수 있다.
    • 이러한 특징은 인터페이스에 다형성을 적용할 수있게 만들어 준다.
  • 인터페이스의 선언
    • interface 키워드를 사용하여 인터페이스를 선언할 수 있다.
      ex) public interface 인터페이스명 {} 
    • 인터페이스는 클래스와 마찬가지로 public, default 접근 제어자를 지정할 수 있다.
  • 인터페이스의 구성
    • 인터페이스의 멤버
      • 모든 멤버 변수는 public static final 이어야 한다.
        • 생략 가능
      • 모든 메서드는 public abstract 이어야 한다.
        • 생략 가능 (static 메서드와 default 메서드 예외)
      •  생략되는 제어자는 컴파일러가 자동으로 추가해준다.
  • 인터페이스의 구현
    • 인터페이스는 추상 클래스와 마찬가지로 직접 인스턴스를 생성할 수 없기 때문에 구현되어 생성된다.
      • impolements 키워드를 사용하여 인터페이스를 구현할 수 있다.
      • 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 한다.
      • 만약 인터페이스의 추상 메서드 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경하면 된다.
  • 인터페이스 상속
    • 인터페이스 간의 상속이 가능하다.
      • 인터페이스 간의 상속은 implements가 아니라 extends 키워드를 사용한다.
      • 인터페이스는 클래스와는 다르게 다중 상속이 가능하다.

2. 디폴트 메서드와 static 메서드

  • 디폴트 메서드
    • 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드이다.
      • 메서드 앞에 defualt 키워드를 붙이며 블럭{} 이 존재해야 한다.
      • default 메서드 역시 접근 제어자가 public 이며 생략이 간으하다
      • 추상 메서드가 아니기 때문에 인터페이스의 구현체들에서 필수로 재정의 할 필요는 없다.
  • static 메서드
    • 인터페이스에서 static 메서드 선언이 간으하다
      • static의 특성 그대로 인터페이스의 static 메서드 또한 객체 없이 호출이 가능하다.
      • 선언하는 방법과 호출하는 방법은 클래스이 static 메서드와 동일하다
        • 접근 제어자를 생략하면 컴파일러가 public을 추가해 준다.

3. 다형성

  • 타입 변환
    • 자동 타입 변환 
      • 인터페이스 변수 = 구현객체; 는 자동으로 타입 변환이 일어난다.
    • 강제 타입 변환
      • 구현 객체 타입 변수 = (구현 객체 타입) 인터페이스 변수;

 

 

브랜치 활용하기

 

 

 

브랜치 만드는 명령어

  • git branch 브랜치이름
  • git branch  브랜치 확인 명령어

 

브랜치 이동 명령어

  • git switch 브랜치 이름 
  • git checkout 브랜치 이름

브랜치 한번에 생성 & 이동

  • git switch -c 브랜치 이름
  • git checkout -b 브랜치이름

브랜치 합치는 명령어

  • git switch 최종 브랜치 이름
  • git merge 합칠 브랜치

 

pull request 활용하기

pull request 란? pull 당겨서 합치는것 (merge) request 요청하다

메인에 합치는것을 요청하다.

 

github에 올리기

  • git push origin 브랜치이름