Java/혼공단

[혼공단10기] JAVA - 2주차

슈코 2023. 7. 16. 18:38

혼공단 2주차

혼공단 2주차가 시작되었다.

2주차는 챕터 6부터 9까지인데 이 부분은 자바에서 가장 중요한 내용인 객체지향프로그래밍이다

처음 자바를 접했을땐 이 부분이 도저히 이해가 되지 않았는데,

이번에 공부하게 되어 기분이 좋다ㅎㅎ

자바의 객체지향적인 특징은 스프링에서도 핵심적인 내용으로 다루어지기 때문에

확실하게 짚고 넘어가면 좋을거 같다

 

2주차 계획에서 한가지 아쉬웠던 부분은

만약 자바를 처음 공부하시는분들이라면 이번 주차가 어려울 수 있을거 같다는 부분이다

자바에서 객체지향의 특징은 가장 중요한 부분이라고 생각하기 때문에

조금 더 많은 시간을 가지고 갔으면 어떨까싶다

그래서 2주차를 2번에 나누어서 2주차, 3주차로 진행하면 좋을거 같다는 생각이 든다.

 

2주차 기본미션 - p330 문제 5번 실행 결과 인증화면 캡처하기

이번 주차의 기본미션은 330 페이지에 있는 문제의 결과를 캡처하여 인증하는것이다

해당 문제는 부모클래스와 자식클래스를 각각 정의해놓고

new 연산자를 통해서 자식 객체를 생성했을때의 상황을 가정하고 있다.

 

먼저 Parent 클래스와 Child 클래스 정보이다

Parent 클래스 정보
Child 클래스 정보

Parent 클래스와 Child 클래스 각각 2개씩의 생성자를 가지고 있다

매개변수가 없는 기본생성자는 String 값 하나를 매개변수로 받는 생성자를 호출하는 로직이다

 

다음은 Child 클래스를 통해서 객체를 생성해주는 ChildExample 클래스이다

child 객체를 생성해주는 ChildExample 예제
ChildExample 예제의 결과

결과를 확인해보면,

1. 부모클래스의 매개변수 생성자 call 출력

2. 부모클래스의 기본 생성자 call 출력

3. 자식클래스의 매개변수 생성자 call 출력

4. 자식클래스의 기본 생성자 call 출력

로 볼 수 있다.

 

이 문제를 만들어낸 의도는 무엇일까?

이 문제에서 우리가 공부할 수 있는 내용은 몇가지가 있다

 

 

먼저 new 연산자를 통한 객체 생성이다

new Child();에서 Child()가 기본생성자를 호출해서 객체를 생성해주는 부분이다

 

보통 현업에서 많은 경우에

A a = new A(); 와 같은 객체생성을 많이 하게 되는데

이때 new A()는 기본 생성자를 호출해서 객체를 생성해주는 부분이라는 것을 잊으면 안된다!

 

 

두번째로, 상속 상황에서의 생성자 호출이다

모든 객체는 클래스의 생성자를 호출해야하고(부모 객체 포함),

부모 객체 생성없이 자식 객체만 생성할때, 자식 생성자에 의해 부모 생성자가 호출된다

ChildExample 예제에서 new Child();를 통해 기본 생성자를 호출할때,

부모 클래스의 기본 생성자인 Parent()를 호출하게 되고, 이 기본 생성자에서 매개변수가 있는 생성자를 명시적으로 호출해주고 있기때문에, 부모클래스의 매개변수가 있는 생성자가 가장 먼저 호출되는것이다

자식 기본 생성자에서 부모생성자를 호출하는 super()가 없어도 자동 생성되는것을 예제를 통해 확인할 수 있다

 

즉,

new Child() → Child() → super() → Parent() → this.("대한민국") 순으로

부모클래스의 생성자가 호출되고, Child()에서 다시 this("홍길동")을 먼저 호출하고 기본 생성자 call이 출력된다

 

기본 생성자 호출에 관한 부분은 p233에서 확인할 수 있고,

상속 상황에서 생성자 호출은 p314에서 확인할 수 있다!

 

( 혹 잘못된 부분이 있거나, 잘 모르는 부분이 있으면 언제든 댓글 남겨주시면 확인해보겠습니다! )

 

2주차 선택미션 - 객체 지향 프로그래밍의 개념을 정리하기

 

객체지향프로그래밍

부품에 해당하는 객체를 만들고, 이 부품들을 조립해서 하나의 프로그램을 만드는 기법

객체는 속성과 동작으로 구성되어 있는데, 이 부분을 필드와 메소드로 구현한다

결국 객체지향프로그래밍은 독립적으로 존재하고 있는 객체들의 상호작용으로 이루어져 있는 특징이 있다

 

객체와 클래스

클래스 = 설계도

클래스에는 객체를 생성하기 위한 필드와 메소드를 정의되어 있고, 클래스를 통해 객체를 생성할 수 있다

 

인스턴스

클래스로부터 만들어진 객체를 인스턴스라고 한다

(클래스로부터 객체를 만드는 과정을 인스턴스화)

 

즉 개발자는 설계를 통해서 클래스를 먼저 만들고,

해당 클래스를 인스턴스화해서 객체로 만들어 사용한다!

 

필드

필드는 객체의 고유 데이터, 상태 정보를 저장하는 곳

변수와 비슷해서 클래스 멤버 변수라고 부르기도한다

데이터를 저장하는 곳이기 때문에, 값을 읽고 변경할 수 있지만, 자바빈 규약을 따르는 클래스는

필드를 private로 선언하여 외부로부터 보호하고, setter / getter를 사용하여 값을 읽고 쓰도록 한다

 

생성자

생성자는 클래스로부터 객체를 생성할때 객체의 초기화를 담당한다

new 연산자로 호출

모든 클래스는 생성자가 반드시 필요(없으면 컴파일러가 기본 생성자 추가)

생성자는 여러개 있을 수 있다

메소드와 비슷한 모양이지만, 리턴타입이 없고 클래스 이름과 동일한 특징

클래스에 생성자가 명시적으로 선언되어 있으면 반드시 선언된 생성자로 객체 생성

this()를 통해서 다른 생성자를 호출할 수 있다(생성자의 첫줄에서만 허용)

 

정적멤버

정적멤버는 클래스에 위치하고, 객체들이 공유하는 멤버

(객체들이 중복으로 사용하는데, 매번 생성하는것은 비효율적이라 한곳에 모아놓고 사용하는 용도)

정적필드/정적메소드 생성 시 클래스에 static 키워드를 붙여서 생성

객체마다 가지고 있어야할 데이터라면 인스턴스 필드, 객체들이 공용데이터로 사용하려면 정적 필드

 

상속

상속은 부모가 자식에게 물려주는 행위

객체지향프로그래밍에서 상속은 부모 클래스의 멤버를 자식 클래스가 재사용할 수 있는 형태

잘구현되어 있는 부모클래스의 특징을 그대로 이어받고, 추가적인 작업을 할때 사용하면 용이하다

부모클래스 수정 시 자식들에게도 반영되어 유지보수에 용이하다

class 자식클래스 extends  부모클래스 {} 로 구현

JAVA에서는 다중상속 X

부모클래스의 private 필드/메소드는 상속제외

상속 시 자식클래스 생성때 부모클래스의 생성자도 호출 - super()

 

메소드 재정의(overriding)

부모클래스에 있는 메소드를 자식클래스에서 재정의하여 사용하는 것

동일한 패턴이어야 한다(리턴타입/이름/파라미터)

더 강한 접근제한 X (부모가 public인데, 자식이 private일 수 없음 )

재정의 시 부모클래스의 메소드 사용하고 싶으면 - super.부모메소드();

 

클래스 타입변환

상속 관계에 있는 클래스에서 발생

부모클래스에 자식클래스를 생성해도 정상 작동 - 부모클래스 a = new 자식클래스();

부모타입으로 변환된 자식객체는 부모클래스에 선언된 필드와 메소드만 접근가능

( 자식클래스에서 재정의되었으면, 자식클래스의 메소드 호출 ) 

 

다형성

사용 방법은 동일하지만, 다양한 객체를 이용하여 다양한 실행결과가 나오도록 하는 성질

역할과 구현으로도 표현할 수 있다

상속과 인터페이스에서 잘표현될 수 있는 개념

자동차가 타이어를 사용하는 방법은 동일, 어떤 타이어를 사용할지 고르면 된다

자동차의 역할은 모두 동일, 어떤 자동차를 탈지 고르면 된다

메소드 재정의 + 타입 변환 --> 다형성

필드의 타입을 부모타입으로 선언 - 다양한 자식 객체들이 저장될 수 있다 = 필드의 다형성

매개변수 타입이 클래스 - 자식 객체도 파라미터로 사용할 수 있다 = 매개변수의 다형성

 

 

추상클래스

클래스들의 공통적인 특성을 추출해서 선언해둔 클래스

공통된 필드와 메소드의 이름을 통일하려고 할때 사용할 수 있다

public abstract class 클래스명 {} 으로 작성

메소드의 선언 통일 + 실행 내용 다를때 = 추상 메소드 선언 후 사용!

 

인터페이스

객체의 사용 방법을 정의한 타입

프로그램의 내용을 역할과 구현으로 표현하여

역할(인터페이스)를 먼저 설계하고, 구현(구현 클래스)로 나누어서 개발

 

 

스프링에도 아주 자주 사용하는 개념들이 많이있다

이 부분은 예시와 함께 한번 정리하는 시간을 가져야겠다

많이 요약해서 내용이 조금 부족해 보이는 부분은 조금씩 늘려가보도록 해야겠다

 

'Java > 혼공단' 카테고리의 다른 글

[혼공단10기] JAVA - 6주차  (0) 2023.08.15
[혼공단10기] JAVA - 5주차  (0) 2023.08.08
[혼공단10기] JAVA - 4주차  (0) 2023.07.25
[혼공단10기] JAVA - 3주차  (0) 2023.07.21
[혼공단10기] JAVA - 1주차  (2) 2023.07.09