상세 컨텐츠

본문 제목

객체지향 정리 (java)

수업 일지/Java

by NayC 2021. 4. 7. 12:40

본문

728x90

1. 캡슐화 알고 있다.

2. 두 개 이상의 캡슐이 만들어질텐데, 조립할 줄 안다. (has A)

- 멤버로 꽂아넣고, 만드는 방식

3. 남이 만든 클래스를 상속받아서 (오버라이드) 쓸 수 있다. (is A) 

<-> 반대로 내가 클래스를 만들었는데 여러 자식을 만들어야 할 것 같음. 공통 분모를 잘 사용할 수 있도록

1) 꼼수. 대문 만들어주기 (onPrint()같은거)

2) 자식이 내거 쓰고자하는게 있다면 재원 getter로 만들어줘서 쓰게 하기

3) 만약 못쓰게 하려면 abstract class 할 수도 있고 / 자식이 꼭 쓰도록 강요하려면 abstract method


(29일~31일 다시 새롭게 만들면서 복습) 

 

1. 새로운 패키지에, 파일을 만들어주었다. 

 

Program에는 main 함수를,

Exam에다가는 데이터를 담아줄 것이다. 

 

1.1 국, 영, 수 데이터를 가진 Exam 파일과 메인 함수를 담은 Program 파일을 만들어보자

 

[Exam 파일] 설명

- total 이라는 함수를 사용한다면, kor + eng + math 를 불러주는것이다 / 라고 코드가 보여주고 있는것

 

출처 : 34일 수업
출처 : 25일 수업

[Program 파일] 설명

- [Exam] 파일을 '이용'하려면 객체를 만들어주어야 함

(Exam만 있으면 그냥 자동차 팜플렛, new Exam이 되어야 실체화된 자동차가 된거고, 이걸 exam 붕붕이로 불러주겠다는 것과 같은 맥락)

- 객체를 만들어주었으니, 이제 참조변수 exam을 활용해서 '사용'이 가능하다. 

-> 그래서 exam.total, exam.avg도 가능하게 됨

 

2. 국, 영, 수 말고 컴퓨터 과목도 추가해서, total과 avg를 구해주고 싶다면? 

-> NewExam 파일을 새롭게 만들어보자. (새로운 자동차를 타고, 새로운 기능들을 사용하고 싶다는 맥락과 같지~)

 

여기서 create class를 누르면 손쉽게 만들어진다~ 

 

cf) 여기서 7번째줄 ~ 11번째 줄은 주석처리

-> 안그러면 exam, total, avg 가 이름이 같아서 Duplicate local variable 오류가 남

 

Exam을 추가나 수정을 해서 써야겠다. 

-> extends Exam 

 

2.1 자, 이제 값을 넣고 돌려볼까 (feat. 초기화)

 

NewExam exam = new NewExam(); 로 NewExam의 기능을 쓰겠다는거 알겠고 (그걸 exam으로 부르는거고) / 

NewExam은 extends Exam을 했으니 Exam의 기능들도 exam으로 가져다 쓰겠다는거 알겠음. 

 

질문 2가지

1. 언제 Exam 기능들을 불러왔을까?

2. 왜 total:30, avg:10의 결과가 나왔을까?  

 


2.2 개념 보충) 부모를 가지는 클래스는 두 개의 객체를 생성한다. 

설명은 NewlecExam인데, 나는 NewExam으로 만들었으므로ㅎㅎ 이하 계속 NewExam으로 ~~

여기서는 부모를 가진 NewExam이 2개의 객체를 생성한다는 것

즉, new NewExam이라고 객체를 생성해주면 사실은 

1. 부모인 Exam의 객체와

2. 부모+내거까지 NewExam의 객체 // 이렇게 2개를 생성하는 것

 

부모에 해당하는 영역을 super라는 이름으로 구분해준다.

class 안에서 this를 쓰면 전체 객체를, super를 '상속받은 부모에 대한 객체'를 의미함. 

 

cf) 

부모 - 상위 클래스, 기반 클래스

자식 - 하위 클래스, 파생 클래스

 

p.s 생성자도 2개가 생성되는것 (생략되어 안보이는 super까지)


다시, 질문 2가지

1. 언제 Exam 기능들을 불러왔을까?

2. 왜 total:30, avg:10의 결과가 나왔을까?  

 

1. NewExam 차의 기능을 exam으로 사용하겠다.

2. 순서대로 읽고

3. total, avg도 읽은 후에 print해냄

-> 3에서 컴퓨터과목(com)이 포함되지 않았으므로 total :30, avg :10이 나오는 것

 

2.3 Override (total과 avg에도 컴퓨터 과목 넣어주기 대작전)

함수 모양 똑같이 작성해야 override가 됨

-> 컨트롤 스페이스 + 그리고 내게 맞는 조건에 따라 적절히 고치기 (super 포함 등)

 

- NewExam 파일의 16번째줄의 super는 생략 불가능 (Exam 파일/부모의 total임을 알려줘야 하기에) 

 

3. 생성자 (Constructor) :  국, 영, 수 과목 점수 바꿔주기

Overload 메소드

Overload 생성자

둘 다 초기화 하지만 차이점

 

오버로드 생성자 : 넘겨받은 값으로 초기화 

기본 생성자 : 넘겨받는게 아니라 내부적으로 정의된 값으로 초기화

 

Q. 그런데 값은 10 + 20 + 30 + 10(컴퓨터) = 70 이 아니라 40이 나오는 이유 (avg도 마찬가지)

-> 두 개 있을 때 기본 생성자가 우선순위를 가짐

 

두 개 선택해서 쓸 수 있음

1) Program main에서 객체 만들때 선택해서 쓸 수도 있지만

 

2) super로 내가 받는거를 선택해서 쓸 수도 있음

원래는 // super() 생략된거고 + com = 10; 해서 total 40 이었는데, super (1,2,3)으로 내가 받는걸 선택하니까 -> 16

오버로드한 생성자를 -> 자식도 선택적으로 부모를 선택하게 된 것

 

3.1 생성자 오류나는 경우 

생성자는 둘 중 하나 선택해서 쓸 수 있지만 (다 생략해도 자바가 기본 생성자로 컴파일해주기도 함)

오버로드 생성자를 남기고, main 함수에서 인자를 보내주지 않으면 (당연히) 에러가 난다. (사용자가 반드시 인자 넘겨받는 식으로만 객체를 생성하겠다라고 컴파일러가 생각하기 때문)

 

그리고 그동안 묵시적으로 super 기본 생성자를 호출했는데 정의가 안되어 있다고 오류가 남. 

-> super(100, 100, 100) 등 인자를 받는 형식으로 써주면 오류 해결 (결과는 total : 310)

 

일부러 빼면 오버로드 생성자만 가지고 하도록 한 것

보통 기본 생성자 같이 하는게 좋다. 

 

 

4. 개념 보충) 객체와 참조형식의 개수

Exam을 참조할 수 있느냐!를 묻는 것

 

4.1 개념 보충) 형식에 따른 재정의 함수 호출 관계 

첫번째 그림은 A의 기능이 내거인거마냥 그대로 가져다 쓰는 경우 

두번째 그림은 A의 f를 쓸 수 없어서, 내가 다시 재정의하는 경우

 

B b = new B인데

A b = new B 로도 가능

 

b가 참조형식이여서

- 자기에게 맞는 객체면 참조할 수 있는거

 

B b

A b 

일 때

b.f() 의 차이는 어떻게 될까~~ 

4.2 NewExam 파일에서도 인자를 받을 수 있도록 만들어줘보자.

결과값은 위에 생성자 때문임 

4.3 생성자 중복 없애주기 

결과값 나오는걸 보려고 10, 20, 30 으로 적은건데 주석처리 한 거 의미 살리면 주려는 값 (10, 10, 10)을 넘겼어야
cf)

 

5. 자바는 참조형식의 함수보다 객체 형식의 함수 호출을 우선으로 한다. 

상식적으로는 그동안 NewExam newExam = new NewExam(); 형태가 익숙했지.

근데 Exam exam = new NewExam(); 하면 에러날 것 같은데도! 4라는 결과가 나왔다~ 는게 요지.

(NewExam 객체가 우선되어서 4가 나오는건 당연한 얘기)

 

형변환

b.f(2)도 같은 결과

 

 

728x90
반응형

'수업 일지 > Java' 카테고리의 다른 글

다형성(interface) 정리 (java)  (0) 2021.04.08
추상화 정리 (java)  (0) 2021.04.08
따옴표 정리  (0) 2021.03.12
숙지를 위한 연습 문제들 (java)  (0) 2021.03.11
변수 정리  (0) 2021.03.08

관련글 더보기