추상 클래스

추상(abstract) : 실체 간에 공통되는 특성을 추출한 것

추상 클래스 : 실체 클래스들의 공통적인 특성(필드와 메소드)을 추출해서 선언한 클래스. 

실체 클래스 : 객체를 직접 생성할 수 있는 클래스

https://www.proprofs.com/quiz-school/story.php?title=abstract-classes

 

추상 클래스의 용도

① 공통된 필드와 메소드의 이름을 통일할 목적

  • 실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.
  • 데이터와 기능이 동일한 필드나 메소드를 추상클래스에서 선언해줌으로써 더 간결하고 효율적인 코드 작성이 가능하다.

② 실체 클래스를 작성할 때 시간 절약

  • 공통되는 필드와 메소드를 추상클래스에 선언하면 다른 점만 실체 클래스에 선언하면 되기때문에 시간을 절약할 수 있다.
  • 일반적으로 개발 프로젝트에서 설계자와 코더는 다른 일을 수행하는데, 코더가 작성해야 할 클래스가 다수이고 이 클래스들이 동일한 필드와 메소드를 가져야 한다면 , 설계자는 이 내용들을 추려내어 추상 클래스로 설계 규칙을 만드는 것이 좋다.
  • 그리고 코더에게 추상 클래스를 상속하는 실체 클래스를 만들도록 요구하면 된다.

 

추상 클래스 선언

  • 추상 클래스를 선언할 때에는 선언에 abstract 키워드를 붙여야 한다.
  • abstract가 붙여진 추상클래스는 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.
  • 따라서 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성해야 한다.
  • 추상 클래스는 새로운 클래스를 만들기 위해 부모 클래스로만 사용된다. 즉, 실체클래스를 만들 때 extends 뒤에만 붙을 수 있다.

 

추상 메소드와 재정의

  • 추상 클래스에는 메소드가 있을 수도 없을 수도 있다.
  • 그런데 만약 추상 메소드가 있다면, 꼭 추상 클래스 안에 선언되어야 한다.
  • 추상 클래스에서 메소드의 선언만 통일하고 실행 내용이 실체 클래스마다 다를 경우 추상 메소드를 선언할 수 있다.
  • 추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호{}가 없는 메소드이다.
  • 자식 클래스(실체 클래스)는 반드시 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다.

위의 예시를 보면, Animal 이라는 추상클래스에서 추상 메소드 sound() 를 선언했다. 이유는 동물들 마다 울음 소리가 다르기 때문에, 이 부분은 하위 클래스 마다 고유한 소리를 내도록, 즉 Dog 클래스 에서는 '멍멍'으로 실행이 되도록, Cat 클래스 에서는 '야옹'이 실행되도록 하기 위함이다. 하위 클래스인 Dog, Cat에서는 sound() 메소드를 재정의해서 사용한다.

 


※ 추상 클래스에대해 알아보다 인터페이스와의 차이에 대한 내용을 찾게되었는데, 다음에 공부할 내용인 인터페이스라 읽어 보면 좋을 것 같아서 참고용으로 가져와 봤다.

 

https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-java/

 

Difference between Abstract Class and Interface in Java

Abstract class vs Interface 

  • Type of methods: Interface can have only abstract methods. An abstract class can have abstract and non-abstract methods. From Java 8, it can have default and static methods also. From Java 9, it can have private concrete methods as well.
  • Final Variables: Variables declared in a Java interface are by default final. An abstract class may contain non-final variables.
  • Type of variables: Abstract class can have final, non-final, static and non-static variables. The interface has only static and final variables.
  • Implementation: Abstract class can provide the implementation of the interface. Interface can’t provide the implementation of an abstract class.
  • Inheritance vs Abstraction: A Java interface can be implemented using the keyword “implements” and an abstract class can be extended using the keyword “extends”.
  • Multiple implementations: An interface can extend one or more Java interfaces; an abstract class can extend another Java class and implement multiple Java interfaces.
  • Multiple Inheritance:  Interface supports multiple inheritance; an abstract class does not support multiple inheritance.
  • Accessibility of Data Members: Members of a Java interface are public by default. A Java abstract class can have class members like private, protected, etc.

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

[24] JAVA 타입 변환과 다형성  (0) 2022.12.06
[23] JAVA 인터페이스  (0) 2022.12.04
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[20] JAVA 상속  (0) 2022.11.30
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29

 

1. 어려웠던 부분  : 주특기 숙련주차가 시작되었다. 이번주에 주어진 과제는 로그인과 회원가입 기능이다. 일단 제공된 항해 강의 처음에 JPA와 관련되서 영속성 컨텍스트라는 개념이 나오는데, 강으를 천천히 돌려봐도 잘 이해가 되지 않았다. 오늘 강의 따라 듣느라 아직 정리를 못했는데, 강의를 일단 빨리 1회독 하고 내일 개념정리를 해야겠다.

 

 

2. 느낀 점 : 체력이 많이 약해진 느낌이다. 오늘 병원을 다녀왔다. 의사선생님이 잠을 잘자야 한다고 하셨는데 ㅎㅎ 진짜 빨리 일요일이되서 푹 자고 싶다.

 

3. 새로 알게 된 내용 : 오늘 강의를 따라하다가 컨트롤러 파일 하나의 경로를 잘못 지정해서 그냥 리팩토링 해서 다른 디렉토리로 옮겼는데, 그 이후로 localhost창을 호출했을때 계속해서 404번 오류가 발생했다. 거의 한시간 동안 혼자서 고민하고 중간에 미경님이랑 유리님 그리고 지나가는 재영님도 같이 고민해주시고 기술매니저님도 같이 고민해 주셨다. 그리고 마지막에 은솔님이랑 소영님한테 가서 물어봤는데, 컴파일이 된 후에 리팩토링하면 오류가 발생할 수 있다는 것을 !! 바로 알려주셔서 다시 빌드를 했더니 바로 해결되었다. 다들 어쩜 이렇게 다양한 에러들을 척척 해결하는지 ㅎㅎ 부러울 따름 ! 

 

4. 셀프칭찬 (오늘 잘한 일) : 오늘은 몸이 안좋아서 병원도 갔다오고 다른 날보다 열심히 하지 못했다. 그럼에도 불구하고 어떻게든 강의를 듣고 과제를 시작하려고 했다는 점 칭찬하고, 중간 중간 10분씩 쉬어가면서 컨디션 조절하려고 했던 것도 칭찬한다. 이런 날도 있는거지뭐.

 

5. 내일 할 일 : chap07-3 공부, 주특기 숙련주차 강의 끝내기.


[오늘 공부한 부분]

  • JPA 영속성 컨택스트(블로그 정리 필요)
  • 스프링 숙련주차 강의 4개 (아직 반이 남았다)
  • 상속, 다형성 언어스터디

[21] JAVA 타입변환과 다형성

 

[21] JAVA 타입변환과 다형성

기본 타입 변환 처럼 클래스에서도 타입 변환이 있다. 다형성 : 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질 다형성을 구현하려면 상속, 메소드 재

leejincha.tistory.com

 

 

  • 기본 타입 변환 처럼 클래스에서도 타입 변환이 있다.
  • 다형성 : 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질 
  • 다형성을 구현하려면 상속, 메소드 재정의타입변환이 필요하다.

1. 자동 타입 변환

  • 자동 타입 변환(promotion)이란 ? 프로그램 실행 도중에 자동으로 타입 변환이 일어나는 것
  • 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생한다.

  • 자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것
  • 따라서 자식은 부모 타입으로 자동 타입 변환이 가능하다.
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입 이라면 자동 타입 변환이 일어날 수 있다.
  • 즉, 아래의 그림에서 D객체는 바로 위의 부모인 B타입으로 자동 타입 변환이 될 수도 있고, A 타입으로 자동 타입 변환이 될 수 있다.

 

https://hyuntaekhong.github.io/blog/java-basic21/

 

  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
  • 그러나 예외가 있는데, 메소드가 자식클래스에서 재정의 되는 경우이다. 이땐 자식 클래스의 메소드가 대신 호출된다. (다형성)

출처 : <혼자 공부하는 자바>

  • Child 객체는 method3() 메소드를 가지고 있지만, Parent 타입으로 변환된 이후에는 method3()을 호출할 수 없다.
  • 그러나 부모와 자식 모두에게 있는 method2()는 재정의를 통해 타입 변환 이후에도 호출이 가능하다.

 

 

2. 필드의 다형성

  • 자동 타입 변환이 왜 필요할까? 다형성을 구현하기 위해서이다.
  • 다형성을 구현하는 법 : 상속 + 재정의 + 타입 변환
  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다. 
  • 자식 클래스는 부모의 메소드를 재정의해서 메소드의 실행 내용을 변경함으로써 더 우수한 실행 결과가 나오게 할 수 있다.

  • 예를 들어, 부모 클래스인  Tire의 필드값을 자식 클래스인 HankookTire에서 필드값을 교체함으로써 부모클래스의 메소드를 수정하지 않아도 자식클래스에서 다양한 메소드를 실행할 수 있는 것! 
  • 더보기
    Tire 클래스가 Car 클래스와 같은 패키지에 있다고 가정하자. 그렇다면 Car 클래스는 Tire클래스를 사용할 수 있다. 그래서 Car 클래스에서 Tire클래스로 각 바퀴에 대한 객체를 만들었다. 바퀴의 수명이 다하면 새로운 객체로 바꿔주려고 한다. Tire 클래스를 부모 클래스로 하는 자식 클래스 Hankook과 Kumho 를 만들고 타이어 교체시기가 되면 해당 위치의 타이어를 hankook이나 kumho 클래스로 새로운 객체를 만들어서 교체해줄 수 있다. 이때 hankook과 kumho 클래스의 roll을 재정의했을 경우 이전에 사용했던 roll과는 다르게 작동한다. 이렇게 다양한 자식 객체를 넣어 결과가 달라지는 것을 다형성이라고 한다.

 

 

 

3. 매개 변수의 다형성

  • 자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만, 주로 메소드를 호출할 때 많이 발생한다.
  • 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다. 
  • 매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행결과가 다양해 질 수 있다.
  • 자식 객체가 부모의 메소드를 재정의 했다면 재정의된 메소드를 호출함으로써 메소드의 실행결과가 다양해 진다.

 

 

 

4. 강제 타입 변환

  • 강제 타입 변환(casting) : 부모 타입을 자식 타입으로 변환하는 것
  • 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때만 적용된다.
  • 자식 타입이 부모 타입으로 자동 타입 변환하면, 부모에 선언된 필드와 메소드만 사용 가능한데,
  • 만약 자식에 선언된 필드와 메소드를 사용하고 싶다면, 자식 타입으로 다시 강제 타입 변환해서 자식의 필드와 메소드를 사용한다.

 

 

 

 

5. 객체 타입 확인

  • 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연산자를 사용한다.
  • instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용된다.
  • 메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 확인하고 안전하게 강제 타입 변환을 해야 한다.
  • 만약 타입을 확인하지 않고 강제 타입 변환을 시도하면 - ClassCastException이 발생할 수 있다.
// 사용법
boolean result = 객체 instanceof 타입

// Parent가 부모 클래스고 Child가 자식 클래스라고 가정하자.
Parent parent = new Parent();

// parent라는 객체가 Child로부터 만들어진 객체냐?
parent instanceof Child // false // classcastexception 발생

// Child 객체가 자동 타입 변환으로 parent에 대입됨
Parent parent = new Child();

// 활용법
public void method(Parent parent){
    // parent는 child 객체가 자동 타입 변환된 경우이므로 true
    if (parent instanceof Child){
        // 강제 타입 변환 조건에 맞으므로 강제 타입 변환 가능
        Child child = (Child) parent;
    }
}

참고자료

 

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

[23] JAVA 인터페이스  (0) 2022.12.04
[22] JAVA 추상클래스  (0) 2022.12.03
[20] JAVA 상속  (0) 2022.11.30
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.named-queries

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

https://tecoble.techcourse.co.kr/post/2020-04-26-Method-Naming/

 

좋은 코드를 위한 자바 메서드 네이밍

tecoble.techcourse.co.kr

 

'Coding > 기타' 카테고리의 다른 글

ChatGPT !! 엄청나다 !!  (0) 2023.01.10
HTTP 이해  (0) 2022.12.06
RESTful API 설계 가이드  (0) 2022.12.01
Error : Address already in use 오류 해결하기  (0) 2022.11.04
피그마 figma  (0) 2022.10.27

 

 

우리조 너무 고마웠습니다 ㅎㅎ 난 우리조 가수담당이라 신청곡 받아서 틀어놓고 조원분들은 뒤에서 백댄서 해주셨다 ㅋㅋ 너무 웃기쟈나 ~~

 

 

1. 어려웠던 부분  :  오늘은 김가은 기술매니저님을 통해 새로운 키워드들을 많이 알게되었다. 먼저 스프링 컨트롤러, 서비스, 리포지토리를 쭉 설명해주셔서 그 부분은 일단 정리가 잘 된 느낌인데, @Bean 이라던지, @Transactinal , DTO inner class, DTO 생성자 선언 방법 등 아직 더 해야할 공부가 훨씬 더 많아서 좀 조급한 마음이 들었다. 마음은 조급한데 체력과 집중력이 따라주질 않아서 오늘은 다른 것 보다 이 부분이 힘들었던 것 같다. 오늘은 무조건 두시전에 푹 자야지! 

 

2. 느낀 점 : 이번 한 주가 처음이라 그런지 항해99시작 이후로 가장 힘들었는데, 내가 느낀 감정을 같은 반 사람들도 많이 느낀 것 같아서 위안이 되었다. 뭔가 혼자 잘 못하고 있는 것 같다는 생각이 들때마다, 기술매니저님들이 잘하고 있다고 토닥여 주시고, 주변에 좋은 반 사람들이 공감해주고 위로해줘서 잘 버틸 수 있었던 것 같다. 이런식이라면 눈물 짜더라도 끝까지 버틸 수 있을 듯(?) ㅎㅎ

 

3. 새로 알게 된 내용 : 시험으로 API설계가 출제될 예정이라길래 API 명세서를 만들어서 제출하는 과제일까 라는 생각으로 RESTful API 자료를 찾아봤다. 너무 좋은 자료들이 많아서 덕분에 잘 이해가 된 것 같다. CRUD 기능을 잘 구현하는 것은 당연히 중요하고, URI 나 변수명, 메소드 명 등 식별자를 잘 정하는 것도 중요한 것 같다. 앞으로 코드를 작성할 때는, 그 부분도 좀 더 신경써서 작성해야겠다. 

 

4. 셀프칭찬 (오늘 잘한 일) : 시험을 무리없이 끝냈다 ! 지난주 토요일까지만 해도 항해99 스프링강의랑 김영한 선생님 인프런 강의를 보면서 단하~~~나도 이해하지 못했고, 코드를 어디서부터 어떻게 작성해야 하는지조차 몰라서 막막했는데, 역시 사람이란 적응의 동물이던가, 어떻게든 하게 되있구나 라는 생각이 들었다. 안 될 것 같으면서도 어떻게든 따라가고 있는 나를 칭찬해 ~_~

 

5. 내일 할 일 : chap07-02블로그 정리, chap07-3 공부, 기술매니저님이 짚어주신 개념들 하나씩 정리해보기.


[오늘 공부한 부분]

  • JAVA 타입 변환과 다형성 공부 (블로그 정리 필요)
  • 주특기 입문 시험(API 구현)
  • 시험 문제풀이 세션(DTO 작성하고 사용하는 법을 자세히 보여주셨다. 특히 DTO간에 상속 받는 부분)
  • 깃허브 프로필 마크다운으로 ReadMe 작성하기 
  • 김가은 매니저님의 키워드 세션

 

RESTful API 설계 가이드

 

RESTful API 설계 가이드

1. REST API의 탄생 REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었습니다. 로이 필딩은 HTTP의 주요 저자 중 한 사람으로

leejincha.tistory.com

[07] 항해99 주특기 입문 1주차 - 주특기 시험 (API 구현)

 

[07] 항해99 주특기 입문 1주차 - 주특기 시험 (API 구현)

오늘 지난 1주일 동안 과제를 하면서 배웠던 내용을 토대로 주특기 시험을 봤다. 시험 난이도는 이번주 과제를 마쳤더라면 누구나 할 수 있을정도로 쉬웠지만, 하면서 예기치않은 오류를 봐서

leejincha.tistory.com

 

+ Recent posts