❤ 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤
∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ♪
( ・ω・) ・ω・) ・ω・) ・ω・) ・ω・)
(っ )っ )っ )っ )っ )っ
( __フ( __フ( _フ( __フ( __フ
(_/彡 (_/彡 (_/彡 (_/彡 (_/彡
오늘도 헛 둘 헛 둘 📝
수업 시작 전 몸풀기
오늘 배울 수업 내용은 상속/다형성/추상화메서드, 클래스입니다
왜 자바의 특징 중 상속과 다형성이 나오는 걸까?
여기서 질문이 생깁니다
다형성이란 건 뭘까요?
백과사전에 다형성 의미는 고유한 특징이 다양한 성질을 뜻한다고 합니다
객체지향 언어 특징 4가지 : 추상화, 캡슐화, 상속, 다형성
지금까지 배워온 과정에 우리는 추상화와 캡슐화까지 배웠다.
그리고 나머지 관문인 상속과 다형성을 오늘 배운다고 하였다.
요즘 읽고 있는 "객체지향의 사실과 오해"라는 책에서 이런 단어를 보았다
동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성(polymorphism)라 한다.
간단히 다형성을 시작하기 전 이러한 느낌을 잡고 시작하려고 한다
코드의 재 사용성을 높이기 위한 방법
' 상속 '이라는 내용은 코드 재사용성과 깊은 연관이 있다
코드 재사용성을 높이기 위한 방법 4가지 중 가장 원시적인 건 복사+붙여 넣기이고
그다음이 기능 메서드 정의, 그리고 Class사용이 있다.
가장 마지막이 상속과 인터페이스 이용이다.
자바에 상속은 양날의 검 같은 존재이다
잘 쓰면 너무 좋지만 잘못 쓰면 정말 쓰레기(?) 코드를 만들 수 있다.
저번 과제 중 CRUD를 위한 코드를 봤을 때
DAO class를 생각해 보자.
우린 데이터베이스의 튜플에 값을 자바에서 사용하기 위해 데이터베이스의 드라이버를 로드하고
매번 커넥션을 호출하여 사용 후 반납 하는 과정을 모든 DAO에 매번 선언해야 했다.
얼마나 번거로운 일일까?
생각해 보면 분명 현업에선 저런 객체를 한두 개 사용하는 것이 아닐 텐데.
만약에 데이터베이스의 관리자 비밀번호를 바꾼다고 했을 때?
DAO객체가 10개라면 개발자는 10개의 클래스에 정의된 내용을 다 바꾸어야 된다.
그런 번거로움을 줄이기 위해 (코드 단순화)를 위해서. 상속이라는 개념이 생겼다
상속을 사용하면 10번의 작업이 1번의 작업으로 바뀔 수 있는 미라클이 된다고 한다.
다만 어떻게 정의하고 어떻게 사용하냐에 따라 이건 득이 될 수 있고 실이 될 수 있으니 주의해야 한다
상속(Inheritance)
Java의 최상위 클래스는 Object이다
모든 클래스들은 Object 클래스의 자식 클래스이다.
우리가 system.out.println() 메서드를 사용할 수 있었던 것은 해당 메서드가 이 Object 클래스가 있기에 가능한 것이다.
이런 걸 보면 상속 은은 계층화를 떠올리게 된다.
설계할 때 상위 클래스를 정의하고 하위 클래스가 상위 클래스의 자원을 쉽게 가져다 쓰는 개념이라 생각하면 될 것 같다
중복된 코드를 상속을 통해 재 사용성을 높이는 목적으로 주로 사용된다고 생각하면 된다
상속의 특징
1. 다중 상속을 지원하지 않는다 , 자식 클래스는 1개의 부모 클래스에게만 상속받을 수 있다
2. 상속의 횟수에 제한을 두지 않는다
상속의 주의점
1. 부모클래스의 private 접근 제한을 갖는 필드 및 메서드는 자식클래스에서 접근할 수 없다
2. 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default접근 제한을 갖는 필드 및 메서드도 자식이 물려받을 수 없다
3. 이외의 경우 모두 상속의 대상이 된다
4. 다중 상속을 허용하지 않지만 여러 자식 클래스에 상속은 가능하다
이러한 상속의 특징으로 자바의 클래스를 가지고 상속의 관계를 구현할 수 있다.
super Class 자료형으로 선언된 참조변수가 super Class로부터 상속받은 모든 sub Class의 객체에 참조 가능하다
이 내용을 비롯해 상속은 다형성과 연결 지을 수 있다
용어
Super Class : 부모클래스를 super Class & 상위 클래스 라고한다
Sub Class : 자식클래스를 sub Class & 하위 클래스 라고 한다
extends : 상속을 받을 sub Class 명 뒤에 해당 키워드를 적어주고 키워드 뒤에는 super Class 명을 적으면 된다
super : super Class의 멤버변수나 메서드를 가리킨다
this : Sub Class의 this는 super Class가 아닌 this를 사용한 class의 멤버변수의 주소를 가리킨다.
abstact : 추상화 클래스나 추상화 메서드의 키워드
Method overriding(메서드 오버라이딩) : super Class에서 선언한 메서드를 sub Class 클래스 안에서 재정의한 것.
Method overloading(메서드 오버로딩 ) : 메서드명이 동일하지만 매개변수 타입과 개수가 다른 메서드를 같은 공간에 정의하는 것
UP CAST(업캐스팅) : sub Class로 정의된 변수를 super Class로 자료형을 형변환하는 것 - 명시적으로 적지 않아도 컴파일러가 자동으로 함
DOWN CAST(다운캐스팅) : super Class 자료형으로 정의된 변수를 sub Class 자료형으로 형변환 하는 것 , 컴파일러가 자동으로 하지 않으므로 개발자가 직접 명시적으로 캐스팅을 해야 한다
깨알 과제
미니농장 Farm을 만들어 보자.
야채 vegetable과 과일 fruits 가 있다
야채는 이름과 크기, 수량 관리방법은 일주일에 한 번만 물 주기
과일은 이름과 크기, 수량 관리방법은 이틀에 한번 물 주기
과일은 당도를 측정하며 기록하고 당도가 20 이하면 보통
당도가 20 이상이면 좋음이라고 출력한다
모든 야채와 과일은 자신의 정보를 출력합니다
출력 방식은
이름 / 크기 / 수량 / 관리방법 / 당도가 있는 경우 당도
위의 내용을 분석하여 슈퍼클래스와 서브클래스를 설계해 보세요
나의 설계
공통되는 변수 : 이름/크기/수량/관리방법
메서드 : 정보출력
고민해야 하는 것
관리방법이라는 것은 두 개다 필요한 변수가 맞지만 , 채소와 과일에 따라 내용이 다르다.
즉 처리해야 하는 실행이 다르다는 것이다.
이것은 메서드로 정의해야 할 것 같다
Farm Class
멤버변수 - 이름, 크기, 수량
메서드 - 정보 출력, 관리방법
Vegetable Class extends Farm
관리방법 중 물 주기에 대한 주기만 수정
Fruits Class extends Farm
멤버변수 - 당도를 추가한다
메서드 - 물주기에 대한 주기만 수정한다
다형성
수업에 앞서 말했던 다형성! 많이 어렵다. 정말 정확하게 설명하기가 어려운 것 같다.
기본적으로 자료형이 가지고 있는 변수와 메서드를 접근하는 것으로 시작하여
변수의 값으로 참조할 수 있는 것이 super Class로부터 상속받은 모든 객체라는 점을 생각하면 될 것 같다
우리가 공부를 처음 시작할 때 변수 선언문을 생각하면
String a = "1234";
Int b = a; 는 불가하다. 이유는 a는 String자료형으로 참조 타입이다 , b는 int 자료형으로 원시타입이다, 서로 자료형이 다르기 때문에
해당 선언문은 불가하다
하지만 Farm farm = new Vegetable();은 가능하다.
이유는 Vegetable 클래스는 Farm 클래스에 상속을 받은 sub Class 이기 때문이다
Farm farm = new Vegetable();
이 문법은 다형성도 다형성이지만 업캐스팅에 속하는 내용이기도 하다.
클래스를 계층으로 생각해 보면
이러한 구조이기 때문이다.
Farm으로부터 상속받은 Vegetable 클래스의 객체를 Farm 자료형인 farm에게 대입하였기 때문이다.
이때 선언된 farm 변수는 Farm 클래스의 자료형으로 선언되었기 때문에
Vegetable 클래스에서 선언된 메서드를 사용할 수 없다.
사용을 하려면 Farm 클래스에 선언을 해야 한다 , 메서드명은 동일하게 선언해야 한다
(빈 껍데기)라도 선언해야 인식할 수 있다.
추상화
사전적인 의미를 먼저 찾아보았다
백과사전에 있는 추상화의 의미는 가시적 형상을 모방하여 재현하는 방식을 벗어나 점, 선, 면, 색채의 순수 조형 요소로 구현한 그림
실재하는 객관적, 물적 대상을 재현하는 것이 아닌 비 구상적이고 반 사실주의적 경향의 미술을 의미한다고 한다
소프트웨어 용어사전에는 중요한 특징을 찾아낸 후 간단하게 표현하는 것이라고 한다
사실 생각해 보니 사이버대학 4년 중 추상화를 들어본 생각이 났다. 다시 자료를 찾아보니 '정보교과교육개론' 수업에
추상화의 이해 단락과 컴퓨터과학과 추상화라는 단락에서 배운 적이 있었다
그때 메모했던 내용을 찾아보니 교수님께서는
문제에서 핵심적인 부분을 찾아 집중하는 것, 공통적이고 꼭 필요한 특성은 살리고 관계가 적은 부분은 제거하고
규칙을 찾아 표현하는 것이며 대상을 바라보는 목적이나 관점에 따라 추출된 핵심 요소가 달라진다고 했다.
뭐 이러한 이론적인 추상화는 여기까지 설명하고 자바의 추상 메서드와 추상 클래스에 대해서 설명해 보자
키워드 : Abstract
1. 추상 클래스 Abstract Class
추상 클래스는 하나 이상의 추상 메서드(미완성 메서드)를 포함하고, 일반적인 메서드와 필드도 가질 수 있는 클래스다
추상 클래스는 직접 객체를 생성할 수 없기 때문에 서브 클래스에서 추상 메서드를 구현하도록 강제한다
A a = new A() 같은 생성자 호출 자체를 할 수 없다고 생각하면 된다
2. 추상 메서드 Abstract Method
추상 메서드는 선언만 있고 본체(구현부)가 없는 미완성 메서드다, 메서드문법에서 중괄호가 없는 게 특징이다.
즉 메서드의 시그니처는 있지만 구체적인 동작은 서브클래스에서 필수적으로 구현해야 한다
추상 메서드가 포함된 클래스는 반드시 추상 클래스여야 한다
이러한 내용을 통해 보면 추상 클래스는 추상 메서드를 선언하면서 상속을 통해 자식 클래스에서 완성을 유도하는 클래스라고 보인다.
그래서 다들 미완성 설계도 라고 하는 것 같다.
why? 추상메서드와 클래스를 사용할까?
추상 메서드의 장점은 다형성과 유연성, 확장성, 강제성이라고 한다
다형성은 하위 클래스에서 같은 이름의 추상 클래스를 구현함으로 상위 클래스 타입으로
여러 클래스 객체를 다룰 수 있고 하위 클래스에서 특정 동작을 구체화 할 수 있다.
강제성은 추상 메서드를 갖고 있는 클래스를 상속한 하위 클래스는 반드시 추상 메서드를
구현해야 하기 때문에 특정 동작이 빠지거나 불충분한 경우를 방지하기 때문에 안정성을 높이게 된다
추상 클래스의 장점은 부분적인 구현 제공으로 추상 클래스는 일반 메서드를 가질 수 있기 때문에
공통된 동작의 부분적인 구현을 제공할 수 있다.
추상 클래스는 변수와 메서드를 함께 그룹화할 수 있으므로 코드의 조화와 가독성을 향상한다
기본적으로 자바는 단일 상속을 지원하는데 단 하나의 부모 클래스만을 가질 수 있는 게 원칙이다.
단일 상속만을 허용하는 이유는 다형성의 모호함을 제거하기 위해서이다.
그렇기 때문에 추상클래스를 사용하면 클래스 간에 계층 구조와 구분이 명확해진다
추상 클래스의 단점은 상위 클래스의 메서드를 하위 클래스가 재정의 할 때 캡슐화 유지가 어렵다는 점이다.
참조하는 상위 클래스의 메서드가 내부적으로 다르게 구현될 수 도있고, 하위 클래스에서 특정 메서드를 정의하고
이후에 상위 클래스에서 동일한 이름의 메서드를 추가하게 되면 컴파일 에러가 발생될 수 있다.
그리고 자바의 단일 상속 원칙에 따라 다중 상속여부 사용에 따라 추상클래스는 인터페이스와 비교해야 한다.
모쪼록 학원에서 배운 내용을 토대로 생각하면
상속이나 추상 메서드 클래스는 모두 양날의 검이라고 생각해야 한다.
이 추상 메서드, 추상 클래스, 상속을 잘못 사용하게 된다면
코드의 복잡성이 증가하거나 추상 클래스로의 제한이 있기 때문에 오히려 설계에 독이 될 수 있다
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Jᴀᴠᴀ' 카테고리의 다른 글
2023/11/15 ⛳️ 추상클래스/메서드/상속 과제 - 마무리 (0) | 2023.11.15 |
---|---|
2023/11/14 📌 추상클래스/메서드/상속 과제 (1) | 2023.11.15 |
2023/11/12 🦄 학원동호회 - 주말 스터디 (2) | 2023.11.13 |
2023/11/10 🧚♀️ 조별 프로젝트 마지막날 (1) | 2023.11.13 |
2023/11/09 😱 조별 프로젝트 그리고 이틀째 (0) | 2023.11.13 |