객체배열
객체 - 서로다른 자료형을 클래스라는 하나의 형태로 heap공간에 생성한것
배열 - 같은 자료형끼리의 묶음을 하나의 변수로 관리
레퍼런스 변수(참조변수)에 대한 배열
동일한 타입의 여러 인스턴스들을 배열로 관리할 수 있다.
대입연산자는 오른쪽에 있는 값을 왼쪽으로 대입
대입조건 : 서로가 같은 자료형
carArray[0] = new Car("롤스로이스",250); - > 기본생성자랑 비슷하게 대입
carArray = new Car("롤스로이스",250); -> 이건안됨 carArray는 Car[] 타입이므로 다른 타입이라
향상된 for문
오른쪽이 반복을 돌릴 객체 왼쪽이 객체의 타입 for(Car c : carArray2)
기본생성자 super class
alt a는 전체 alt d는 다풀림 alt r은 생성
/ 모든 필드 값을 문자열로 반환 /
public String getInformation() {
만드는 이유 -> 메소드 하나로 편하게 모든 필드 값을 가져오기위해서 사용
/ 5명의 회원 정보를 담을 객체 배열 생성/
MemberDTO[] members = new MemberDTO[5];
MemberDTO타입의 객체가 5개 들어갈 수 있겠구나
현재는 초기화해준게 없으니 null이겠구나
MemberInsertManager memberInsertManager = new MemberInsertManager();
memberInsertManager.insert(members);
사용하려는 메소드가 반환형이 없는 void이므로 변수가 필요 없고 호출만
하면 된다
참조된 값을 담는게 참조변수
매개변수에 넣어주는 값을 전달인자
new앞에 뛰어쓰기
메소드 기능을 구현하기 위해 만든 메소드
매개변수를 쓰는 이유 -> 기능을 구현하긴 하는데 혼자서는 하기 힘듬
매개변수를 빼면 사용자에게 어떻게 입력값을 받을 수 있을까 -> 없음
minNumberOf(int first, int second)
매개변수는 기능을 사용하기위해 필수적으로 필요한 값을 받겠다는 것이다.
다른클래스에서 받아오고 return으로 반환하려면 매개변수가 필요하다
입력값을 임의로 직접넣는것 ->하드코딩
package com.greedy.section02.uses;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
/* 동일한 타입의 여러 개의 인스턴스를 인자로 전달하거나 리턴받는 경우에도
* 객체 배열을 이용할 수 있다.
* */
/* DTO를 활용한 간단한 회원 관리용 프로그램
* 구현기능
* 1. 여러 명의 회원 정보를 받아 한 번에 여러 회원 정보를 등록
* 2. 전체 회원 조회 시 여러 명의 회원 정보를 반환
* */
Scanner sc = new Scanner(System.in);
MemberManager memberManager = new MemberManager();
menu:
while(true) {
System.out.println("=======회원 관리 프로그램 =======");
System.out.println("1. 회원등록");
System.out.println("2. 회원 전체 조회");
System.out.println("9. 프로그램 종료");
System.out.print("메뉴 선택 : ");
int no = sc.nextInt();
switch(no) {
case 1 : memberManager.signUpMembers(); break;
case 2 : memberManager.printAllMembers(); break;
case 9 : System.out.println(" 프로그램을 종료합니다"); break menu;
default : System.out.println("잘못된 번호를 입력하셨습니다. "); break;
}
}
sc.close(); //해당 반복문이 종료가 되지 않아서 빨간 줄 라벨문법 menu로 묶으면 됨
}
}
package com.greedy.section02.uses;
public class MemberManager {
/**
* <pre>
* 여러 명의 회원 정보를 등록
* </pre>
*/
public void signUpMembers() {
/* 5명의 회원 정보를 담을 객체 배열 생성*/
MemberDTO[] members = new MemberDTO[5];
/* 5명의 회원 정보를 각 인덱스에 할당 */
members[0] = new MemberDTO(1, "user01", "pass01", "홍길동", 20, '남');
members[1] = new MemberDTO(2, "user02", "pass02", "유관순", 16, '여');
members[2] = new MemberDTO(3, "user03", "pass03", "이순신", 40, '남');
members[3] = new MemberDTO(4, "user04", "pass04", "신사임당", 36, '여');
members[4] = new MemberDTO(5, "user05", "pass05", "윤봉길", 22, '남');
MemberInsertManager memberInsertManager = new MemberInsertManager();
memberInsertManager.insert(members);
}
/**
* <pre>
* 모든 회원 목록을 조회하여 정보를출력
* </pre>
*/
public void printAllMembers() {
/* MemberSelectManager의 인스턴스 주소를 이 코드에서 한번만 사용하고
* 다른곳에서 불러서 사용할 일이 없을 때는 아래와 같이 축약해서 사용할 수 있다.
*
* new MemberSelectManager().selectAllMembers()
* [ 인스턴스 생성 주소값 ].사용하려는 메소드명
* */
// MemberDTO[] selectedMembers = new MemberSelectManager().selectAllMembers();
/* MemberSelectManager의 인스턴스 주소를 다른 곳에서도 참조해서 사용해야하는 경우에는
* 타입에 맞는 변수를 선언하고 대입하여 해당변수를 이용해서 참조해서 사용한다.
*
* MemberSelectManager memberSelectManager = new MemberSelectManager();
* [MemberSelectManager 타입의 주소값을 받을변수] = [인스턴스 생성]
*
* memberSelectManager. 사용하려는 메소드명
* [참조 변수]
* */
// new java.util.Date(); 재사용이 아니라 한줄쓰고 끝
MemberSelectManager memberSelectManager = new MemberSelectManager();
MemberDTO[] selectedMembers = memberSelectManager.selectAllMembers();
System.out.println("========가입된 회원 목록========");
for(MemberDTO member : selectedMembers) {
System.out.println(member.getInformation());
}
System.out.println("==============================");
System.out.println("총 " + selectedMembers.length + "명의 회원이 가입되어 있습니다.");
}
}
package com.greedy.section02.uses;
public class MemberDTO {
/* 관리할 회원 정보를 추상화해서 필드 작성*/
private int num;
private String id;
private String pwd;
private String name;
private int age;
private char gender;
/* 기본 생성자*/
public MemberDTO() {}
/* 모든 필드를 초기화하는 매개변수 생성자*/
public MemberDTO(int num, String id, String pwd, String name, int age, char gender) {
this.num = num;
this.id = id;
this.pwd = pwd;
this.name = name;
this.age = age;
this.gender = gender;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
/* 모든 필드 값을 문자열로 반환 */
public String getInformation() {
return "MemberDTO num= " + this.num
+ ", id= " + this.id
+ ", pwd= " + this.pwd
+ ", name= " + this.name
+ ", age= " + this.age
+ ", gender= " + this.gender;
}
}
package com.greedy.section02.uses;
public class MemberInsertManager {
/**
* <pre>
* 여러 명의 회원 정보를 한 번에 등록할 수 있는 기능 제공
* </pre>
* @param members 회원 정보를 객체 배열 형태로 전달
*/
public void insert(MemberDTO[] members) {
System.out.println("회원을 등록합니다.");
for(int i = 0; i < members.length; i++) {
System.out.println(members[i].getName() + "님을 회원 등록에 성공했습니다.");
}
System.out.println("총 " + members.length + "명의 회원 등록에 성공했습니다.");
}
}
package com.greedy.section02.uses;
public class MemberSelectManager {
/**
* <pre>
* 회원 정보 전체를 반환하는 메소드
* </pre>
* @return 전체 회원 정보 객체 배열로 반환
*/
public MemberDTO[] selectAllMembers() {
/* 어딘가에 저장된 회원 정보는 없기 때문에 좀전에 사용한 회원정보를 다시 사용*/
return new MemberDTO[] {
new MemberDTO(1, "user01", "pass01", "홍길동", 20, '남')
, new MemberDTO(2, "user02", "pass02", "유관순", 16, '여')
, new MemberDTO(3, "user03", "pass03", "이순신", 40, '남')
, new MemberDTO(4, "user04", "pass04", "신사임당", 36, '여')
, new MemberDTO(5, "user05", "pass05", "윤봉길", 22, '남')
};
}
}
=======회원 관리 프로그램 =======
1. 회원등록
2. 회원 전체 조회
9. 프로그램 종료
메뉴 선택 : 2
========가입된 회원 목록========
MemberDTO num= 1, id= user01, pwd= pass01, name= 홍길동, age= 20, gender= 남
MemberDTO num= 2, id= user02, pwd= pass02, name= 유관순, age= 16, gender= 여
MemberDTO num= 3, id= user03, pwd= pass03, name= 이순신, age= 40, gender= 남
MemberDTO num= 4, id= user04, pwd= pass04, name= 신사임당, age= 36, gender= 여
총 5명의 회원이 가입되어 있습니다.
=======회원 관리 프로그램 =======
1. 회원등록
2. 회원 전체 조회
9. 프로그램 종료
메뉴 선택 : 1
회원을 등록합니다.
홍길동님을 회원 등록에 성공했습니다.
유관순님을 회원 등록에 성공했습니다.
이순신님을 회원 등록에 성공했습니다.
신사임당님을 회원 등록에 성공했습니다.
윤봉길님을 회원 등록에 성공했습니다.
총 5명의 회원 등록에 성공했습니다.
=======회원 관리 프로그램 =======
1. 회원등록
2. 회원 전체 조회
9. 프로그램 종료
메뉴 선택 : 9
프로그램을 종료합니다
상속
ㄴ 부모클래스가 가지는 멤버를 자식 클래스가 물려받아 자신의 멤버인 것처럼 사용할 수 있도록
만든 기술
멤버 외에 타입 또한 상속이 된다.(다형성의 토대)
자바는 단일 상속(하나의 클래스만을 부모클래스로 가짐)만 지원
혼동을 없애기 위해서
클래스 간의 상속시에는 extends키워드를 사용
ex) public class Academy extends Company{}
상속의 장점
새로운 클래스 작성시 기존에 작성된 클래스의 재사용 가능
클래스간 계층 관계가 형성되어 다형성 문법의 토대가 됨
내부에 많은 기능을 가지고 있으면 불필요하게 가져와야하므로
전화와 팩스를 합쳐서 구현하지 않고 따로 구분하여 구현한다.
단점
부모 클래스의 기능 변경시 자식 클래스의 정상적인 동작 유무 예측이 힘듦
IS-A
"자식클래스는 (하나의 ) 부모 클래스이다" 관계로 부모 클래스의 멤버들은 자식클래스가 상속 받음
원은 도형이다-> o 도형은 원이다 -> x 삼각형 사각형도 도형이기 때문
동물은 호랑이다-> x 호랑이는 동물이다->o
작은게 큰걸로 포함되는 내용
chap08-inheritance-lecture-source 프로젝트
super();
부모의 기본생성자로 가서 실행
내 생성자로 와 나머지 실행
this는 내꺼 쓰는거
extends가 없는데 super를 써주면 모든 object class를 상속해서 쓴다
oberride 재정의 Implement 구현한다 alt shift s
package com.greedy.section01.extend;
public class Application {
public static void main(String[] args ) {
/* 상속(inheritance)은 현실 세계의 상속과 비슷한 개념이다.
* 부모가 가지고 있는 재산(자바에서는 클래스가 가지는 멤버[필드, 메소드])을 자식이 물려받는 의미이다.
*
* 클래스 또한 부모클래스와 자식클래스로 역할을 나눠서 부모가 가지는 멤버를 자식이 물려받아
* 자기의 멤버인 것처럼 사용할 수 있도록 만든 기술이다.
*
* 하지만 단순 물려받는 개념보다 조금 더 나아간다면
* 자바에서의 상속은 부모클래스의 확장(extend)의 개념을 가진다
* 물려받아서 자신의 것처럼 사용하는 것 뿐 아니라 추가적인 멤버도 작성이 가능하다.
* 특히 메소드 재정의(overriding)라는 기술을 이용해서 부모가 가진 메소드를 재정의 하는 것도 가능하다.
* */
Car car = new Car();
car.soundHorn();
car.run();
car.soundHorn();
car.stop();
car.soundHorn();
/* 소방차, 레이싱카 모두 자동차이다.
* 모든 자동차는 소방차 혹은 레이싱카가 아니다.
*
* FireCar is a Car(o) / Car is a FireCar(x)
*
* IS-A 관계가 성립이 되는 경우에 상속을 사용할 수 있다.
* */
System.out.println("==============================");
FireCar fireCar = new FireCar();
fireCar.soundHorn();
fireCar.run();
fireCar.soundHorn();
fireCar.stop();
fireCar.sprayWater();
System.out.println("==============================");
RacingCar racingCar = new RacingCar();
racingCar.soundHorn();
racingCar.run();
racingCar.soundHorn();
racingCar.stop();
}
}
package com.greedy.section01.extend;
public class Car {
/* 자동차의 달리는 상태를 확인할 수 있는 필드 */
private boolean runningStatus;
/* 기본생성자 */
public Car() {
System.out.println("Car 클래스의 기본생성자 호출됨...");
}
/**
* <pre>
* 자동차의 기본적인 달리는 기능
* </pre>
*/
public void run() {
runningStatus = true;
System.out.println("자동차가 달립니다.");
}
/**
* <pre>
* 자동차가 기본적인 경적을 울리는 기능
* </pre>
*/
public void soundHorn() {
if(isRunning()) {
System.out.println("빵! 빵!");
} else {
System.out.println("주행중인 아닌 상태에서는 경적을 울릴 수 없습니다.");
}
}
/**
* <pre>
* 자동차의 주행 중 상태를 반환해주는 메소드
* </pre>
* @return true이면 주행중인 상태이며 false이면 멈춘 상태이다.
*/
// private boolean isRunning() {
protected boolean isRunning() {
return runningStatus;
}
/**
*<pre>
* 자동차의 기본적인 멈추는 기능
* </pre>
*/
public void stop() {
runningStatus = false;
System.out.println("자동차가 멈춥니다.");
}
}
package com.greedy.section01.extend;
public class FireCar extends Car{
public FireCar() {
/* 모든 생성자에는 맨 첫줄에 super()를 컴파일러가 자동 추가한다.
*
* 부모의 기본 생성자를 호출하는 구문이다.
* 명시적, 묵시적 전부 사용 가능하다.
* */
super();
System.out.println("FireCar 클래스의 기본생성자 호출됨...");
}
/* 메소드 재정의
*
* @Override 어노테이션
* JDK 1.5부터 추가된 문법으로 오버라이딩 성립 요건을 체크하여
* 성립되지 않은 경우 컴파일 에러를 발생시킨다.
* (오버라이딩이 정상적으로 작성된 것인지를 체크해주는 기능)
* */
@Override
public void soundHorn() {
if(isRunning()) {
System.out.println("빠아아앙~~ 빠아아아앙!!!!!");
} else {
System.out.println("소방차가 앞으로 갈 수 없습니다 비키세요 비켜~~~");
}
}
/**
* <pre>
* 물을 뿌리는 기능을 제공
* </pre>
*/
public void sprayWater() {
System.out.println("불난 곳을 발견했습니다. 물을 뿌립니다. ================>>>>>>>>333");
}
}
package com.greedy.section01.extend;
public class RacingCar extends Car {
/* 기본 생성자 */
public RacingCar() {
System.out.println("RacingCar 클래스 기본 생성자 호출됨...");
}
@Override
public void run() {
System.out.println("레이싱카가 전속력으로 질주합니다!!!!!!");
}
@Override
public void soundHorn() {
System.out.println("레이싱카는 경적을 울리지 않습니다. (조용....)");
}
@Override
public void stop() {
System.out.println("레이싱카가 멈춥니다.");
}
}
Car 클래스의 기본생성자 호출됨...
주행중인 아닌 상태에서는 경적을 울릴 수 없습니다.
자동차가 달립니다.
빵! 빵!
자동차가 멈춥니다.
Car 클래스의 기본생성자 호출됨...
FireCar 클래스의 기본생성자 호출됨...
소방차가 앞으로 갈 수 없습니다 비키세요 비켜~ 빠아아아앙!!!!!
자동차가 달립니다.
빠아아앙
자동차가 멈춥니다.
Car 클래스의 기본생성자 호출됨...
RacingCar 클래스 기본 생성자 호출됨...
레이싱카는 경적을 울리지 않습니다. (조용....)
레이싱카가 전속력으로 질주합니다!!!!!!
레이싱카는 경적을 울리지 않습니다. (조용....)
레이싱카가 멈춥니다.
super와 super()
this 자신의 인스턴스 주소
this.name
-super
부모 클래스의 인스턴스 주소를 보관하는 레퍼런스 변수
자식클래스 내의 모든 생성자와 메소드 내에서 부모클래스의 레퍼런스 변수를 사용할 수 있음
super.name 부모가 가진 주소의 이름?
-super()
부모 생성자를 호출하는 구문으로 매개변수의 타입,개수,순서가 일치하는 부모의 생성자를 호출하게 됨.
this() 는 해당 클래스의 생성자를 호출하는 구문이다
super()는 부모클래스가 가지는 private생성자를 제외한 나머지 생성자를 호출하는 구문이다.
자바의 최상위 클래스는 object 클래스이다.
new java.util.Date()
안쓰려면 임포트 하면된당
클래스 = 설계도
객체 = 결과값 설계도를 메모리공간에 올려놓은것
new연산자로 메모리공간에 구현을해야 실행할수 있음
필드에서 사용되는 변수
색상 -빨강
음향기기 ture
전방센서 true
다형성 부모타입은 자식타입을 받아줄 수 있다
재귀때문에 일어나는 상황을 잘 체크
서로 ComputerDTO c = ProductDTO();
ProductDTO c = Computer();
재귀현상
package com.greedy.section02.superkeyword;
public class Application {
public static void main(String[] args) {
/*
* super : 자식클래스를 이용해서 객체를 생성할 때 부모 생성자를 호출하여 부모 클래스의 인스턴스도
* 함께 생성하게 된다. 이 때 생성한 부모의 인스턴스 주소를 보관하는 레퍼런스 변수로
* 자식 클래스 내의 모든 생성자와 메소드내에서 선언하지 않고도 사용할 수 있는 레퍼런스 변수이다.
* super(): 부모 생성자를 호출하는 구문으로 인자와 매개변수의 타입, 갯수 순서가 일치하는 부모의 생성자를 호출하게된다.
* this()가 해당 클래스 내의 다른 생성자를 호출하는 구문이라면, super()는 부모클래스가 가지는
* private 생성자를 제외한 나머지 생성자를 호출할 수 있도록 한 구문이다.
* */
ProductDTO product1 = new ProductDTO();
System.out.println(product1.getInformation()); // 필드의 기본값으로 초기화됨
ProductDTO product2 = new ProductDTO("s-01234", "삼성", "갤럭시Z폴드2", 2398000, new java.util.Date());
System.out.println(product2.getInformation());
ComputerDTO computer1 = new ComputerDTO();
System.out.println(computer1.getInformation());
ComputerDTO computer2 = new ComputerDTO("퀼컴 스냅드래곤", 512, 12, "안드로이드");
System.out.println(computer2.getInformation());
ComputerDTO computer3 = new ComputerDTO("s-01234", "삼성", "갤럭시Z폴드2", 2398000, new java.util.Date(),
"퀼컴 스냅드래곤", 512, 12, "안드로이드");
System.out.println(computer3.getInformation());
}
}
package com.greedy.section02.superkeyword;
import java.util.Date;
public class ProductDTO {
private String code; //상품코드
private String brand; //제조사
private String name; //상품명
private int price; //가격
private Date manufacturingDAte; //제조일자
public ProductDTO() {
System.out.println("ProductDTO 클래스의 기본생성자 호출함...");
}
/* 모든 필드를 초기화하는 생성자 */
public ProductDTO(String code, String brand, String name, int price, Date manufacturingDAte) {
/*
* 아무 클래스도 상속받지 않았는데 super()가 호출이된다.
* java.lang.Object 클래스의 생성자를 호출하는 것이다.
* 모든 클래스는 Object 클래스의 후손이기 때문이다.
* */
super();
this.code = code;
this.brand = brand;
this.name = name;
this.price = price;
this.manufacturingDAte = manufacturingDAte;
System.out.println("ProductDTO 클래스의 매개변수 있는 생성자 호출함....");
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Date getManufacturingDAte() {
return manufacturingDAte;
}
public void setManufacturingDAte(Date manufacturingDAte) {
this.manufacturingDAte = manufacturingDAte;
}
/* 모든 필드 값을 문자열로 반환하는 메소드 */
public String getInformation() {
return "ProductDTO code= " + this.code
+ ", brean= " + this.brand
+ ", name= " + this.name
+ ", price= " + this.price
+ ", manufacturingDate= " + this.manufacturingDAte;
}
}
package com.greedy.section02.superkeyword;
import java.util.Date;
public class ComputerDTO extends ProductDTO {
/* ComputerDTO클래스는 하나의 상품이다(IS-A)
* */
private String cpu; // cpu
private int hdd; // hdd
private int ram; // ram
private String operationSystem; // 운영체제
public ComputerDTO() {
System.out.println("ComputerDTO 클래스의 기본 생성자 호출....");
}
/* ComputerDTO에 있는 모든 필드를 초기화하는 생성자*/
public ComputerDTO(String cpu, int hdd, int ram, String operationSystem) {
super();
this.cpu = cpu;
this.hdd = hdd;
this.ram = ram;
this.operationSystem = operationSystem;
System.out.println("ComputerDTO 클래스의 모든 필드를 초기화하는 생성자 호출됨....");
}
/* 부모의 필드도 모두 초기화하는 생성자*/
public ComputerDTO(String code, String brand, String name, int price, Date manufacturingDAte, String cpu, int hdd,
int ram, String operationSystem) {
/* 부모의 모든 필드를 초기화하는 생성자로 ProductDTO클래스가 가진 필드를 초기화 할 값 대입*/
super(code, brand, name, price, manufacturingDAte);
this.cpu = cpu;
this.hdd = hdd;
this.ram = ram;
this.operationSystem = operationSystem;
System.out.println("ComputerDTO 클래스의 부모 필드도 초기화하는 생성자 호출함..");
}
/* getter / setter */
/* getter와 setter는 부모 필드의 메소드에 대해서는 자신의 것처럼 사용 가능하다.
* 따로 작성할 필요 없이 부모클래스에 작성한 것을 사용할 수 있다.
* 따라서 자식클래스에 추가된 필드에 대해서만 getter/setter를 작성하면된다.
* */
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public int getHdd() {
return hdd;
}
public void setHdd(int hdd) {
this.hdd = hdd;
}
public int getRam() {
return ram;
}
public void setRam(int ram) {
this.ram = ram;
}
public String getOperationSystem() {
return operationSystem;
}
public void setOperationSystem(String operationSystem) {
this.operationSystem = operationSystem;
}
@Override
public String getInformation() {
/*
* 부모클래스에 작성한 getter를 이용해서 부모 필드가 가진 값도 한번에 문자열 합치기를 한다.
* 부모가 가진 멤버는 super.과 this. 둘다 사용이 가능하다.
* 하지만 코드의 의미를 명확하게 하기 위해 super.을 사용하는 것이 좋다.
*
* super.getInformation(): 정상적으로 부모의 메소드 호출
* this.getInformation(): 재귀호출(자기가 자기자신을 다시 부른다) 일어나며 stackOverflow발생
* getInformation() : 이것도 this. 이 자동으로 추가되어 재귀호출이 일어난다.
* */
return super.getInformation()
+ "ComputerDTO cou= " + this.cpu
+ ", hdd= " + this.hdd
+ ", ram= " + this.ram
+ ", operationSystem= " + this.operationSystem;
}
}
ProductDTO 클래스의 기본생성자 호출함...
ProductDTO code= null, brean= null, name= null, price= 0, manufacturingDate= null
ProductDTO 클래스의 매개변수 있는 생성자 호출함....
ProductDTO code= s-01234, brean= 삼성, name= 갤럭시Z폴드2, price= 2398000, manufacturingDate= Thu Oct 20 15:52:25 KST 2022
ProductDTO 클래스의 기본생성자 호출함...
ComputerDTO 클래스의 기본 생성자 호출....
ProductDTO code= null, brean= null, name= null, price= 0, manufacturingDate= nullComputerDTO cou= null, hdd= 0, ram= 0, operationSystem= null
ProductDTO 클래스의 기본생성자 호출함...
ComputerDTO 클래스의 모든 필드를 초기화하는 생성자 호출됨....
ProductDTO code= null, brean= null, name= null, price= 0, manufacturingDate= nullComputerDTO cou= 퀼컴 스냅드래곤, hdd= 512, ram= 12, operationSystem= 안드로이드
ProductDTO 클래스의 매개변수 있는 생성자 호출함....
ComputerDTO 클래스의 부모 필드도 초기화하는 생성자 호출함..
ProductDTO code= s-01234, brean= 삼성, name= 갤럭시Z폴드2, price= 2398000, manufacturingDate= Thu Oct 20 15:52:25 KST 2022ComputerDTO cou= 퀼컴 스냅드래곤, hdd= 512, ram= 12, operationSystem= 안드로이드
오버라이딩
-부모클래스에서 상속받은 메소드를 자식클래스가 재정의하여 사용하는 것
성립조건
메소드 이름 동일
메소드 리턴타입 동일
매개변수의 타입 개수 순서가 동일
private메소드는 오버라이딩 불가능
final키워드가 사용된 메소드 오버라이딩 불가능
protected를 지우면 default
public
protexted
default
private
package com.greedy.section03.overriding;
public class SuperClass {
/* 오버라이딩 성립 요건 */
/*
* 오버라이딩이란?
* 부모클래스에서 상속받은 메소드를 자식클래스에서 재정의하여 사용하는 것이다.
* */
public void method(int num) {}
private void privateMethod() {}
public final void finalMethod() {}
protected void protectedMethod() {}
package com.greedy.section03.overriding;
public class SubClass extends SuperClass {
/* 부모의 메소드를 정상적으로 오버라이딩했다.
* 1. 메소드 이름 변경하면 에러발생
* 2. 메소드의 리턴타입변경 에러발생
* 3. 매개변수 갯수나 타입이 변경되면 에러발생
* */
@Override
public void method(int num) {
}
/* 4. private 메소드는 오버라이딩 불가*/
/* 5. final 메소드 오버라이딩 불가*/
/* 6. 부모 메소드의 접근제한자와 같거나 더 넓은 범위로 오버라이딩 가능*/
// @Override
// void protectedMethod() { // 더 좁은 범위로 불가능
//
// }
// @Override
// protected void protectedMethod() { // 같은 범위로는 가능
//
// }
@Override
public void protectedMethod() { // 더 넓은 범위로도 가능
}
/* 클래스에도 final을 추가할 수 있는 public final SuperClass처럼 추가하면 상속 자체가 안된다.*/
}