148.객체 지향 프로그래밍 - 상속 시 변수, 생성자 만들 때 주의사항
Q : File과 같은 "슈퍼클래스"에서 구성요소를 만들 때 고려해야할 사항
-> 변수를 만들 때 고려해야할 사항 (접근 제한)
1. private 설정 시 "자식 클래스"가 접근할 수 없음
2. protected 설정 시 "자식 클래스"는 제한 없이 접근할 수 있음
- private 설정 시 "자식 클래스"가 접근할 수 없음
- protected 설정 시 "자식 클래스"는 제한 없이 접근할 수 있음
-> 메소드를 만들 때 고려해야할 사항
- "재정의(Override)" 여부를 고려해야 한다.
- 재정의를 금지시킬 경우에는 final 키워드를 사용한다.
-> 생성자를 만들 때 고려해야할 사항
- 객체 생성을 위한 데이터 설정(초기화)을 수행하는 구문
- 자식 클래스에서도 부모 클래스의 생성자를 맞춰야한다
package oop.inherit6;
public class File {
// 변수
protected String fileName;
protected long fileSize;
// 생성자
public File(String fileName, long fileSize) {
this.setFileName(fileName);
this.setFileSize(fileSize);
}
// 메소드
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}
public String getFileName() {
return fileName;
}
public long getFileSize() {
return fileSize;
}
public void execute() {// super
System.out.println("파일을 실행합니다");
}
}
package oop.inherit6;
public class MediaFile extends File {
public MediaFile(String fileName, long fileSize) {
super(fileName, fileSize);
}
}
Override를 통해서 부모클래스의 값을 변경해서 출력할 수 있다.
public void execute() {// super
System.out.println("파일을 실행합니다");
}
@Override
public void execute() {
System.out.println("영상을 실행합니다");
}
Q.다음 요구사항에 맞게 클래스 구조 구현 및 객체 생성 후 기능 실행해보세요
요구사항
- Galaxy21s
- 전화번호 설정 가능
- 색상 설정 가능
- 전화(call) 기능을 실행하면 "갤럭시21s 전화 기능 실행" 출력
- 문자(sms) 기능을 실행하면 "갤럭시21s 문자 기능 실행" 출력
- 삼성페이(samsungPay) 기능을 실행하면 "갤럭시21s 삼성페이 기능 실행" 출력
- 빅스비(bixby) 기능을 실행하면 "갤럭시21s 음성인식 기능 실행" 출력
- GalaxyFold3
- 전화번호 설정 가능
- 색상 설정 가능
- 전화(call) 기능을 실행하면 "갤럭시폴드3 전화 기능 실행" 출력
- 문자(sms) 기능을 실행하면 "갤럭시폴드3 문자 기능 실행" 출력
- 삼성페이(samsungPay) 기능을 실행하면 "갤럭시폴드3 삼성페이 기능 실행" 출력
- 홍채인식(iris) 기능을 실행하면 "갤럭시폴드3 홍채인식 기능 실행" 출력
- IPhone11
- 전화번호 설정 가능
- 색상 설정 가능
- 전화(call) 기능을 실행하면 "IPhone11 전화 기능 실행" 출력
- 문자(sms) 기능을 실행하면 "IPhone11 문자 기능 실행" 출력
- 아이튠즈(itunes) 기능을 실행하면 "IPhone11 아이튠즈 기능 실행" 출력
- 시리(siri) 기능을 실행하면 "IPhone11 음성인식 기능 실행" 출력
- IPhone12
- 전화번호 설정 가능
- 색상 설정 가능
- 전화(call) 기능을 실행하면 "IPhone12 전화 기능 실행" 출력
- 문자(sms) 기능을 실행하면 "IPhone12 문자 기능 실행" 출력
- 페이스타임(faceTime) 기능을 실행하면 "IPhone12 영상통화 기능 실행" 출력
- 시리(siri) 기능을 실행하면 "IPhone12 음성인식 기능 실행" 출력
package oop.inherit7;
public class Phone {
protected String number;
protected String color;
public void setNumber(String number) {
this.number = number;
}
public void setColor(String color) {
this.color = color;
}
public String getNumber() {
return this.number;
}
public String getColor() {
return this.color;
}
public Phone(String color) {
this(null, color);
}
public Phone(String number, String color) {
this.setNumber(number);
this.setColor(color);
}
public void call() {
System.out.println("전화 기능 실행");
}
public void sms() {
System.out.println("문자 기능 실행");
}
}
package oop.inherit7;
public class Galaxy extends Phone{
public Galaxy(String color) {
super(color);
}
public Galaxy(String number, String color) {
super(number, color);
}
public void samsungPay() {
System.out.println("삼성페이 기능 실행");
}
}
package oop.inherit7;
public class Galaxy21s extends Galaxy {
public Galaxy21s(String color) {
super(color);
}
public Galaxy21s(String number, String color) {
super(number, color);
}
// 고유기능
public void bixby() {
System.out.println("갤럭시21s의 음성인식 기능 실행");
}
// 마음에 들지 않는 기능들을 재정의
@Override
public void call() {
System.out.println("갤럭시21s의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("갤럭시21s의 문자 기능 실행");
}
@Override
public void samsungPay() {
System.out.println("갤럭시21s의 삼성페이 기능 실행");
}
}
package oop.inherit7;
public class GalaxyFold3 extends Galaxy {
public GalaxyFold3(String number, String color) {
super(number, color);
}
public GalaxyFold3(String color) {
super(color);
}
// 고유기능
public void iris() {
System.out.println("갤럭시 폴드3의 홍채 인식 기능 실행");
}
// 마음에 들지 않는 기능 재정의
@Override
public void samsungPay() {
System.out.println("갤럭시 폴드3의 삼성페이 기능 실행");
}
@Override
public void call() {
System.out.println("갤럭시 폴드3의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("갤럭시 폴드3의 문자 기능 실행");
}
}
package oop.inherit7;
public class IPhone extends Phone{
public IPhone(String color) {
super(color);
}
public IPhone(String number, String color) {
super(number, color);
}
public void siri() {
System.out.println("음성 인식 기능 실행");
}
}
package oop.inherit7;
public class IPhone11 extends IPhone{
public IPhone11(String number, String color) {
super(number, color);
}
public IPhone11(String color) {
super(color);
}
//고유 기능
public void itunes() {
System.out.println("아이폰11의 아이튠즈 기능 실행");
}
//마음에 들지 않는 기능들에 대한 재정의 수행
@Override
public void call() {
System.out.println("아이폰11의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("아이폰11의 문자 기능 실행");
}
@Override
public void siri() {
System.out.println("아이폰11의 음성인식 기능 실행");
}
}
package oop.inherit7;
public class IPhone12 extends IPhone{
public IPhone12(String number, String color) {
super(number, color);
}
public IPhone12(String color) {
super(color);
}
//고유 기능
public void faceTime() {
System.out.println("아이폰12의 영상통화 기능 실행");
}
//재정의
@Override
public void call() {
System.out.println("아이폰12의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("아이폰12의 문자 기능 실행");
}
@Override
public void siri() {
System.out.println("아이폰12의 음성인식 기능 실행");
}
}
package oop.inherit7;
public class Test01 {
public static void main(String[] args) {
Galaxy21s p1 = new Galaxy21s("010-1010-2020", "골드");
p1.call();
p1.sms();
p1.samsungPay();
p1.bixby();
GalaxyFold3 p2 = new GalaxyFold3("010-1111-2222", "블랙");
p2.call();
p2.sms();
p2.samsungPay();
p2.iris();
IPhone11 p3 = new IPhone11("010-3456-7890", "핑크");
p3.call();
p3.sms();
p3.siri();
p3.itunes();
IPhone12 p4 = new IPhone12("010-1122-3344", "화이트");
p4.call();
p4.sms();
p4.siri();
p4.faceTime();
}
}
- 정답
갤럭시21s의 전화 기능 실행
갤럭시21s의 문자 기능 실행
갤럭시21s의 삼성페이 기능 실행
갤럭시21s의 음성인식 기능 실행
갤럭시 폴드3의 전화 기능 실행
갤럭시 폴드3의 문자 기능 실행
갤럭시 폴드3의 삼성페이 기능 실행
갤럭시 폴드3의 홍채 인식 기능 실행
아이폰11의 전화 기능 실행
아이폰11의 문자 기능 실행
아이폰11의 음성인식 기능 실행
아이폰11의 아이튠즈 기능 실행
아이폰12의 전화 기능 실행
아이폰12의 문자 기능 실행
아이폰12의 음성인식 기능 실행
아이폰12의 영상통화 기능 실행
추상 클래스의 활용
추상화를 통해 우리는 상속 구조를 설계할 수 있으며, 반대되는 개념 용어는 구체화이다.
추상화를 통해 체계를 구축하면 클래스가 두 종류로 나눠지게 된다
-상위 클래스 역할을 수행하는 클래스
-기존에 사용하던 객체 생성을 위한 클래스
이 중에서 상위 클래스 역할을 수행하는 클래스를 쉽게 만들기 위해 추상 클래스라는 요소가 등장한다.
추상(abstract) 클래스 :
상속관계에서 추상적인 상위클래스를 효율적으로 표현하도록 만들어진 클래스
추상(abstract) 메소드를 가질 수 있다.
객체 생성이 불가능
package oop.inherit8;
public abstract class Phone {
protected String number;
protected String color;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Phone (String color) {
this(null, color);
}
public Phone (String number, String color ) {
this.setNumber(number);
this.setColor(color);
}
//추상 메소드 :
//= 형태만 있고 코드가 없는 메소드
//= 추상클래에서만 생성 가능
public abstract void call();
public abstract void sms();
}
package oop.inherit8;
public abstract class Galaxy extends Phone {
public Galaxy(String number, String color) {
super(number, color);
}
public Galaxy(String color) {
super(color);
}
public abstract void samsungPay();
}
package oop.inherit8;
//추상 클래스를 상속받는 경우 상속된 추상 메소드를 반드시 완성시켜야 한다
public class Galaxy21s extends Galaxy {
public Galaxy21s(String number, String color) {
super(number, color);
}
public Galaxy21s(String color) {
super(color);
}
@Override
public void samsungPay() {
System.out.println("갤럭시21s의 삼성페이 기능 실행");
}
@Override
public void call() {
System.out.println("갤럭시21s의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("갤럭시21s의 문자 기능 실행");
}
public void bixby() {
System.out.println("갤럭시21s의 빅스비 기능 실행");
}
package oop.inherit8;
public class GalaxyFold3 extends Galaxy {
public GalaxyFold3(String number, String color) {
super(number, color);
}
public GalaxyFold3(String color) {
super(color);
}
@Override
public void samsungPay() {
System.out.println("갤럭시 폴드3의 삼성페이 기능 실행");
}
@Override
public void call() {
System.out.println("갤럭시 폴드3의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("갤럭시 폴드3의 전화 기능 실행");
}
public void iris() {
System.out.println("갤럭시 폴드3의 홍채인식 기능 실행");
}
}
package oop.inherit8;
public abstract class IPhone extends Phone {
public IPhone(String number, String color) {
super(number, color);
}
public IPhone(String color) {
super(color);
}
public abstract void siri();
}
package oop.inherit8;
public class IPhone11 extends IPhone {
public IPhone11(String number, String color) {
super(number, color);
}
public IPhone11(String color) {
super(color);
}
@Override
public void siri() {
System.out.println("아이폰11의 음성인식 기능 실행");
}
@Override
public void call() {
System.out.println("아이폰11의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("아이폰11의 문자 기능 실행");
}
public void itunes() {
System.out.println("아이폰11의 아이튠즈 기능 실행");
}
}
package oop.inherit8;
public class IPhone12 extends IPhone{
public IPhone12(String number, String color) {
super(number, color);
}
public IPhone12(String color) {
super(color);
}
//고유 기능
public void faceTime() {
System.out.println("아이폰12의 영상통화 기능 실행");
}
//재정의
@Override
public void call() {
System.out.println("아이폰12의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("아이폰12의 문자 기능 실행");
}
@Override
public void siri() {
System.out.println("아이폰12의 음성인식 기능 실행");
}
}
package oop.inherit8;
public class Test01 {
public static void main(String[] args) {
Galaxy21s p1 = new Galaxy21s("010-1010-2020", "골드");
p1.call();
p1.sms();
p1.samsungPay();
p1.bixby();
GalaxyFold3 p2 = new GalaxyFold3("010-1111-2222", "블랙");
p2.call();
p2.sms();
p2.samsungPay();
p2.iris();
IPhone11 p3 = new IPhone11("010-3456-7890", "핑크");
p3.call();
p3.sms();
p3.siri();
p3.itunes();
IPhone12 p4 = new IPhone12("010-1122-3344", "화이트");
p4.call();
p4.sms();
p4.siri();
p4.faceTime();
}
}
- 정답
갤럭시21s의 전화 기능 실행
갤럭시21s의 문자 기능 실행
갤럭시21s의 삼성페이 기능 실행
갤럭시21s의 빅스비 기능 실행
갤럭시 폴드3의 전화 기능 실행
갤럭시 폴드3의 전화 기능 실행
갤럭시 폴드3의 삼성페이 기능 실행
갤럭시 폴드3의 홍채인식 기능 실행
아이폰11의 전화 기능 실행
아이폰11의 문자 기능 실행
아이폰11의 음성인식 기능 실행
아이폰11의 아이튠즈 기능 실행
아이폰12의 전화 기능 실행
아이폰12의 문자 기능 실행
아이폰12의 음성인식 기능 실행
아이폰12의 영상통화 기능 실행
Q. 다음 요구사항에 맞게 클래스 구조 구현 및 객체 생성 후 기능 실행해보세요
요구사항
- 원(Circle) 클래스
- 원의 반지름(radius)을 저장할 수 있어야 한다
- 넓이를 계산하여 반환하는 기능(area)이 있어야 한다.
- 삼각형(Triangle) 클래스
- 폭(width)과 높이(height)를 저장할 수 있어야 한다.
- 넓이를 계산하여 반환하는 기능(area)이 있어야 한다.
- 사각형(Rect) 클래스
- 가로(width)와 세로(height)를 저장할 수 있어야 한다.
- 넓이를 계산하여 반환하는 기능(area)이 있어야 한다.
- 삼각형과 사각형은 다각형(Polygon)으로 분류할 수 있다.
- 모든 클래스들은 크게 도형(Shape)로 분류할 수 있다.
- 필요한 클래스들을 추상클래스와 일반클래스로 나누어 구현하고 각자 객체를 만들어 넓이를 구하여 출력
package oop.inherit9;
public abstract class Shape {
public abstract double area();
}
package oop.inherit9;
public class Circle extends Shape {
public static final double PI = 3.141592;
private int radius;
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
public Circle(int radius) {
this.setRadius(radius);
}
@Override
public double area() {
return PI * radius * radius;
}
}
package oop.inherit9;
public abstract class Polygon extends Shape {
protected int width;
protected int height;
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public Polygon(int width, int height) {
this.setWidth(width);
this.setHeight(height);
}
}
package oop.inherit9;
public class Triangle extends Polygon {
public Triangle(int width, int height) {
super(width, height);
}
@Override
public double area() {
return width * height / 2.0;
}
}
package oop.inherit9;
public class Rect extends Polygon {
public Rect(int width, int height) {
super(width, height);
}
@Override
public double area() {
return width * height;
}
}
package oop.inherit9;
public class Test01 {
public static void main(String[] args) {
Circle s1 = new Circle(5);
System.out.println(s1.area());
Triangle s2 = new Triangle(5, 7);
System.out.println(s2.area());
Rect s3 = new Rect(5, 7);
System.out.println(s3.area());
}
}
- 정답
78.5398
17.5
35.0
--> 동적 타입(다형성)의 객체 생성 방법
package oop.inherit9;
public class Test02 {
public static void main(String[] args) {
//동적 타입(다형성)
Shape s1 = new Circle(5);
System.out.println(s1.area());
Shape s2 = new Rect(5, 7);
System.out.println(s2.area());
Shape s3 = new Triangle(5, 7);
System.out.println(s3.area());
}
}
코드로 알아보기
package oop.poly1;
public abstract class Phone {
public abstract void call();
}
package oop.poly1;
public class GalaxyFold3 extends Phone{
@Override
public void call() {
System.out.println("GalaxyFold3 전화 기능 실행");
}
public void samsungPay() {
System.out.println("GalaxyFold3 삼성페이 기능 실행");
}
}
package oop.poly1;
public class Test01 {
public static void main(String[] args) {
//객체 생성 후 업캐스팅 처리
GalaxyFold3 fold = new GalaxyFold3();
fold.call();
fold.samsungPay();
Phone phone = fold;//업캐스팅(아무런 변환 처리 없이 자동 변환 가능. 묵시적 형변환)
phone.call();
// phone.samsungPay();//있는데 못쓴다!
// GalaxyFold3 fold2 = phone;//안된다(휴대폰이 갤럭시폴드3는 아니니까)
GalaxyFold3 fold2 = (GalaxyFold3)phone;//다운캐스팅(업캐스팅이 선행되어야 한다)
fold2.call();
fold2.samsungPay();
}
}
Q. 과제- 다형성
프로그램 내에서 자료형들을 통합하여 유연하게 구조를 만들 수 있는 기술
다음 요구사항에 맞게 프로그램을 구현
요구사항
- 사용자에게 `Scanner`를 이용하여 휴대폰 종류를 입력받는다
1. 갤럭시21s
2. 갤럭시폴드3
3. 아이폰11
4. 아이폰12
- 사용자에게 `Scanner`를 이용하여 수행할 작업의 종류를 입력받는다.
1. 사진촬영
2. 갤러리보기
3. 통화
4. 문자
- 모든 종류의 휴대폰은 다음 기능들을 가지고 있다.
- 사진촬영(camera)
- 갤러리보기(gallery)
- 통화(call)
- 문자(sms)
- 모든 메소드는 다음과 같은 형태로 출력되어야 한다
- ex : `아이폰11` 선택 후 `사진촬영` 선택 시 `아이폰11의 사진촬영 기능 실행` 메세지 출력
- 이 문제는 다형성을 이용해도 풀리고, 이용하지 않아도 풀린다.
- 상위 클래스는 원하는대로 구현
package oop.poly3;
public abstract class Main {
public abstract void camera();
public abstract void gallery();
public abstract void call();
public abstract void sms();
}
package oop.poly3;
public class Galaxy21s extends Main {
@Override
public void camera() {
System.out.println("갤럭시21s의 사진촬영 기능 실행");
}
@Override
public void gallery() {
System.out.println("갤럭시21s의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("갤럭시21s의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("갤럭시21s의 문자 기능 실행");
}
}
package oop.poly3;
public class GalaxyFold3 extends Main {
@Override
public void camera() {
System.out.println("갤럭시폴드3의 사진촬영 기능 실행");
}
@Override
public void gallery() {
System.out.println("갤럭시폴드3의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("갤럭시폴드3의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("갤럭시폴드3의 문자 기능 실행");
}
}
package oop.poly3;
public class IPhone11 extends Main {
@Override
public void camera() {
System.out.println("아이폰11의 사진촬영 기능 실행");
}
@Override
public void gallery() {
System.out.println("아이폰11의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("아이폰11의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("아이폰11의 문자 기능 실행");
}
}
package oop.poly3;
public class IPhone12 extends Main {
@Override
public void camera() {
System.out.println("아이폰12의 사진촬영 기능 실행");
}
@Override
public void gallery() {
System.out.println("아이폰12의 갤러리보기 기능 실행");
}
@Override
public void call() {
System.out.println("아이폰12의 전화 기능 실행");
}
@Override
public void sms() {
System.out.println("아이폰12의 문자 기능 실행");
}
}
package oop.poly3;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("휴대폰 종류를 입력하세요\n( 갤럭시21s | 갤럭시폴드3 | 아이폰11 | 아이폰12 )");
String model = sc.next();
System.out.println("기능을 입력하세요\n( 사진촬영 | 갤러리보기 | 통화 | 문자 )");
String menu = sc.next();
sc.close();
Main phone = null;
switch (model) {
case "갤럭시21s":
phone = new Galaxy21s();
break;
case "갤럭시폴드3":
phone = new GalaxyFold3();
break;
case "아이폰11":
phone = new IPhone11();
break;
case "아이폰12":
phone = new IPhone12();
break;
default:
System.out.println("없는 종류입니다");
break;
}
switch (menu) {
case "사진촬영":
phone.camera();
break;
case "갤러리보기":
phone.gallery();
break;
case "통화":
phone.call();
break;
case "문자":
phone.sms();
break;
default:
System.out.println("없는 기능입니다");
break;
}
}
}
- 정답
휴대폰 종류를 입력하세요
( 갤럭시21s | 갤럭시폴드3 | 아이폰11 | 아이폰12 )
갤럭시폴드3
기능을 입력하세요
( 사진촬영 | 갤러리보기 | 통화 | 문자 )
문자
갤럭시폴드3의 문자 기능 실행
'Java 웹 개발' 카테고리의 다른 글
21.09.06 - 웹 개발 입문 19일차 (0) | 2021.09.06 |
---|---|
21.09.03 - 웹 개발 입문 18일차 (0) | 2021.09.03 |
21.09.01 - 웹 개발 입문 16일차 (0) | 2021.09.01 |
21.08.31 - 웹 개발 입문 15일차 (0) | 2021.08.31 |
21.08.30 - 웹 개발 입문 14일차 (0) | 2021.08.30 |