일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- SKT
- 알버트
- R
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- AI
- 패스트캠퍼스
- albert
- 패캠챌린지
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- 패스트캠퍼스후기
- 직장인자기계발
- 직장인인강
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- Today
- Total
제주 탈출 일지
패스트캠퍼스 챌린지 17일차 본문
이제 다시 취업 자소서를 쓰기 시작했다. 오랜만에 다시 쓰려고 하니 멍~하니 보다가 스르륵 잠듬..
그래도 패캠 챌린지는 계속 해야하니.. 하지만 자바는 재밌음...ㅎ ㅎ
17일차. ㄱㄱ!
04. 메소드 재정의 하기
하위 클래스에서 메서드 재정의 하기
상속을 받았다고 해서 상위 클래스의 내용을 모두 다 동일하게 사용하지는 않음.
하위 클래스 쪽에서 맞지 않으면 재정의 하여 사용한다.
이것을 오버라이딩이라고 한다.
이클립스에서 오버라이딩도 도와준다
우클릭 -> Source -> Override/Implement method를 클릭하면 상속받은 메소드 중
오버라이딩 할수 있는 메소드를 보여주고, 선택하면 소스를 자동으로 생성해준다.
혁-명
@Override -> 이게 붙어있으면 컴파일러가 해당 메소드가 오버라이딩된 메소드구나를 알 수 있게 해주는 키워드이다.
형 변환이 되었을 때 가상 메서드가 호출됨.
VIPCustomer 클래스만 바뀌었기 때문에 이것만 올리겠다.
package ch04;
public class VIPCustomer extends Customer {
double salesRatio;
private String agentID;
// public VIPCustomer() {
//
// super(0, "no-name");
// bonusRatio = 0.05;
// salesRatio = 0.1;
// customerGrade = "VIP";
//
// System.out.println("VIPCustomer call");
// }
public VIPCustomer(int customerID, String customerName) {
super(customerID, customerName);
customerGrade = "VIP";
bonusRatio = 0.05;
salesRatio = 0.1;
}
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
price -= (int)(price * salesRatio);
return price;
}
public String getAgentID() {
return agentID;
}
public void setAgentID(String agentID) {
this.agentID = agentID;
}
}
@Override 애노테이션을 보면 어떤 메소드가 재정의 되었는지 확인할 수 있다.
05. 메서드 재정의와 가상 메서드 원리
메서드 호출 원리
프로그램 안에는 코드들이 존재.
함수, 변수, 여러가지 명령어 등등등...
이 프로그램이 메모리에 로드가 되면, 크게 두가지 영역으로 나뉘는데
하나는 Code 영역, 하나는 Data 영역( 상수 or static 영역 이라고도 함)
Code영역은 메소드들이 들어감.
메소드들의 기능은 인스턴스별로 다르지 않다. 변수만 달라짐.
변수는 지역변수인 경우는 스택, 인스턴스의 경우 heap에 잡힌다.
그래서 코드영역에 메소드를 넣어두고 메소드를 호출하면 저 코드영역에 저장되있는 메소드의 명령어 set을 실행시키는 것이다.
자바는 모든 메소드가 가상 메소드이다.
메서드의 이름은 주소값을 나타낸다.
가상메서드는 ???
정확히 정의를 말해주지 않아서 구글링함.
다형성의 원리가 적용될 수 있는 멤버 함수(메서드)로써 동적 바인딩으로 처리되는 메서드를 의미
동적 바인딩 수행 시 가상 메서드 테이블을 참조하여 매핑함
- 정적 바인딩이 아닌 동적 바인딩으로 처리되기 때문에 컴파일 시점에 정해지지 않은, 실제로 존재하지 않는, 임시로 존재하는 메서드라는 의미로 가상 메서드라고 지칭함
Java 오버라이딩과 가상 메서드
오버라이딩, 정적 바인딩과 동적 바인딩, C++에서의 가상 함수, Java 에서의 가상 메서드
velog.io
너무나 깔끔하게 잘 정리해 주셨다. ㄳㄳ
그래서 이 인스턴스 별로 가상 메서드 테이블을 두고, 이제 런타임에 인스턴스의 가상 메서드 테이블을 보고 메서드를 호출하게 된다. 그런데 이제 재정의 된 메소드의 경우 메소드 테이블에서 형변환이 되었어도 이미 가상 메서드 테이블에서 재정의된 메소드의 주소를 가리키기 때문에 변수형이 상위 클래스여도 재정의된 하위클래스의 메소드가 호출되는 것이다. 신기신기
06. 다형성과 다형성을 사용하는 이유
다형성이란 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 의미한다.
다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
상속을 하면 클래스간 결합도가 높아지기 때문에 신중하게 설계해야 함.(상위 클래스가 바뀌면 하위 클래스에 영향을 미침)
너무 많은 if-else는 코드의 유지보수를 어렵게 한다. -> 다 뜯어 고쳐야할 가능성 UP
package ch06;
import java.util.ArrayList;
class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal {
@Override
public void move() {
System.out.println("사람이 두 발로 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal {
@Override
public void move() {
System.out.println("호랑이가 네 발로 걷습니다.");
}
public void hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal {
public void move() {
System.out.println("독수리가 하늘을 날아다닙니다.");
}
public void flying() {
System.out.println("독수리가 양 날개를 쭉 펴고 날아다닙니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
// AnimalTest test = new AnimalTest();
// test.moveAnimal(eAnimal);
// test.moveAnimal(tAnimal);
// test.moveAnimal(hAnimal);
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for(Animal animal : animalList) {
animal.move();
}
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
이 코드를 유심히 보면, 서로 다른 클래스이지만, 동일한 move를 animal로 업캐스팅하여 사용하는 것을 확인할 수 있다.
배열로도 사용할 수 있고, 따로 메소드를 정의하여 moveAnimal로 사용하기도 한다. 이게 다형성의 장점.
hunting이나 readBook같은 재정의되지 않은 메소드는 사용할 수 없지만(변수 형은 Animal 이기 때문에) 다운캐스팅을 하면 사용할 수 있다. 하지만 다음 시간에 할것.
다형성을 멤버십 프로그램 확장.
Gold 등급을 추가해야함.
Gold 클래스
package ch06;
public class GoldCustomer extends Customer {
double salesRatio;
public GoldCustomer(int customerID, String customerName) {
super(customerID, customerName);
salesRatio = 0.1;
bonusRatio = 0.02;
customerGrade = "GOLD";
}
@Override
public int calcPrice(int price) {
// TODO Auto-generated method stub
bonusPoint += price * bonusRatio;
return price - (int)(price * salesRatio);
}
}
CustomerTest 클래스
package ch06;
import java.util.ArrayList;
public class CustomerTest {
public static void main(String[] args) {
ArrayList<Customer> customerList = new ArrayList<>();
Customer customerT = new Customer(10010, "Tomas");
Customer customerJ = new Customer(10020, "James");
Customer customerE = new GoldCustomer(10030, "Edward");
Customer customerP = new GoldCustomer(10040, "Percy");
Customer customerK = new VIPCustomer(10050, "Kim");
customerList.add(customerT);
customerList.add(customerJ);
customerList.add(customerE);
customerList.add(customerP);
customerList.add(customerK);
for(Customer customer : customerList)
{
System.out.println(customer.showCustomerInfo());
}
int price = 10000;
for(Customer customer : customerList)
{
int cost = customer.calcPrice(price);
System.out.println(customer.getCustomerName() + " 님이 " + cost + " 원 지불하셨습니다.");
System.out.println(customer.getCustomerName() + " 님의 현재 보너스 포인트는 " + customer.bonusPoint + " 입니다.");
}
}
}

calcPrice와 일부 속성을 제외하면 Customer의 속성을 그대로 활용하기 때문에 상속을 통해 클래스를 구현해 주었다.
그리고 CustomerTest 클래스에서 형변환을 통해 모든 클래스가 가지고 있는 showCustomerInfo(), calcPrice()와 같은 메소드를 사용하여 출력해주었다. (일부 메소드는 재정의된 메소드 이다. ex. calcPrice)
이전 강의에서 말했듯 가상 메소드이기 때문에 상속받은 클래스의 형변환이 일어났을때 메소드는 재정의 된 메소드가 호출된다.
오늘 많은 내용을 들었다. 이전 변수의 메모리 영역에 대한 내용이 살짝 가물가물한데 그거만 복습하고 오늘 공부는 마치도록 하겠다.
벌써 연휴 끝ㄴ...
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패스트캠퍼스 챌린지!' 카테고리의 다른 글
패스트캠퍼스 챌린지 19일차 (0) | 2021.09.24 |
---|---|
패스트캠퍼스 챌린지 18일차 (0) | 2021.09.23 |
패스트캠퍼스 챌린지 16일차 (0) | 2021.09.21 |
패스트캠퍼스 챌린지 15일차 (0) | 2021.09.20 |
패스트캠퍼스 챌린지 14일차 (0) | 2021.09.19 |