※JAVA - 오버로딩(다형성)
-> 자바에서는 메서드의 이름이 같아도 매개변수의 개수나 자료형이 다르면 다른 메서드로 본다.
이 방식을 이용해서 한 클래스 내에 여러 같은 이름의 메서드를 명시할 수 있다.
이걸 메서드 '오버로딩' 이라고 한다.
* 한마디로 같은 클래스에 있는 거면 '오버로딩'이라고도 한다.(상속관계 아닌 것)
1. 오버로딩 장점
비슷한 기능을 하는 메서드가 여러 개라면 일일이 이름을 다 기억해야 하지만, 오버로딩을 하면 한 개의 이름만 기억하 면 된다.
2. 오버로딩 조건
1) 메서드 이름이 같아야 함
2) 매개변수의 개수 또는 타입이 달라야 함 (매개변수타입)-> (메서드타입)이 틀린 거는 조건성립 안됨.
※오버로딩(다형성) 예제
//아래 두개는 오버로딩 안됨
//우선 변수의 타입과이름은 같아야되는데 타입이틀려서 조건성립이 안되고, 매개변수의 타입은 다르
//거나 갯수가 달라야되는데 타입이나 갯수가 같아서 조건성립이 안된다.
void tmp(int num1, int num2){}
String tmp(int num3, int num4){ return "안됨!!"};
//아래 두개는 오버로딩 됨
//매개변수의 타입이 틀리므로 조건성립이됨.
void tmp(int num1, int num2){}
void tmp(int num1, double num2){}
※JAVA - 생성자
1. 생성자란
메서드처럼 클래스 영역에 생성됨
구조도 일반 메서드와 비슷하지만 리턴값이 없다.(void, 기본타입 은 써주지 않는다)
생성자의 이름은 public을 가지고 있는 주 클래스이름과 같아야 함.
모든 클래스는 하나 이상의 생성자를 반드시 가지고 있어야 한다.
(명시 안 하고 있어도 기본 default생성자가 컴퓨터에 의해 적용된 상태이다.)
2. 생성자 종류
1) 기본 생성자(default constructor)
별도로 코드를 쓰지 않아도 컴파일할 때 자동으로 기본 생성자를 추가해서 컴파일한다.
기본 생성자가 자동으로 추가되는 경우는 해당 클래스에 별도의 (커스텀:매개변수 있는것뜻함.) 생성자가 하나도 업 올 때 뿐임.
2) 매개변수가 있는 생성자
생성자는 메서드처럼 동작을 하기 때문에 new인스턴스 객체를 생성할 때 매개변수를 이용해서 생성자 호출 시 인스 턴 수들의 리터널값들을 초기화할 수도 있다.
- 생성자 단축키 : Alt + Insert
빈 공간 마우스 우클릭 > Gennerate > Constructor
* 그리고 public static void main(String [] args) {}는 메인클래스(public 있는)에서 뿐만 아니라 외부클래스 (public 없는)에서도 사용이 가능합니다.
※ 생성자 -기본생성자 예제
public class Ex21_1_생성자 {
public Ex21_1_생성자() {
System.out.println("기본 생성자");
}
public Ex21_1_생성자(String txt) {
System.out.println(txt+" 생성자");
}
public static void main(String[] args) {
Ex21_1_생성자 con1 = new Ex21_1_생성자(); //기본 생성자
Ex21_1_생성자 con2 = new Ex21_1_생성자("홍길동이유"); //홍길동이유 생성자
}
}
1) 생성자는 메인 public으로 선언된 클래스 이름과 같고 반환타입이 없다.
2) 생성자는 매개변수 없는 default 생성자랑 , 매개변수 있는 생성자를 적용가능하다.
-> 위에는 public Ex21_1_생성자(String txt)이라는 매개변수 있는 생성자를 적용하고 있다.
3) main에서 new 해서 새로운 객체를 만들 시 매개변수 유무로 해당 출력하는 메시지들이 다를 것이다.
※ 생성자 -this()
1. this()와 this의 차이
1) this()는 같은 클래스의 다른 생성자를 호출할 수 있다.
무조건 생성자 호출할 때만 사용된다.
super() 도있는데 이건 상속관계에서 부모 생성자 호출할 때 쓰인다.
-> this는 'Car클래스'를 뜻한다. ->this.color는 Car클래스 안에 있는 color라는 인스턴스 변수를 뜻한다.
2) this는 인스턴스 변수와 매개변수의 이름이 같은 경우 해당 클래스의 인스턴스 변수 앞에 붙여서 구분.
public Car(String color, String brand, int door, int maxSpeed) {
this.color = color;
this.brand = brand;
this.door = door;
this.maxSpeed = maxSpeed;
}
※ 생성자 -this() 예제
class Car {
String color;
String brand;
int door;
int maxSpeed;
Car() {
this("레몬");
// main 에서 매겨변수없는 Car() 생성자 호출시 이렇게 Car(String color)
// 처럼 매개변수 1개를 받는 생성자를 this()로 호출가능하다.
// 또 this("레몬" ,"현대",4,100);-> Car(String color, String brand, int door, int maxSpeed)
// 매개변수가 4개 있는 생성자도 호출이 가능할것이다.
}
Car(String color) {
this(color ,"현대",4,100);
//color 는 인자값으로 받아서 적용하고 나머지는null이 안들어있게끔 기본값을 설정해준상태로 4개의 매개변수있는 생성자로 넘기는것이다.
// 아래와같이 color는 인자값을받고 나머지 출력문은 기입해서 출력할수도 있을것이다.
// this.color = color;
// this.brand = "현대";
// this.door = 4;
// this.maxSpeed = 100;
}
public Car(String color, String brand, int door, int maxSpeed) {
// 매개변수 4개받는 생성자 public은 생략가능 다만 생성자는 클래스이름이같아야하고, 반환타입없어야한다.
// this는 자기 클래스를뜻한다. 여기서this는 class Car 뜻하고 this.color 라는것은 class Car
// 안에있는 인스턴스 변수를 뜻한다.
this.color = color;
this.brand = brand;
this.door = door;
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
// 아래와같이 new 인스턴스한 객체들을 출력해준다.
return "Car{" +
"color='" + color + '\'' +
", brand='" + brand + '\'' +
", door=" + door +
", maxSpeed=" + maxSpeed +
'}';
}
public static void main(String[] args) {
Car car = new Car(); //이렇게 default생성자 호출시 this("레몬"); 가호출될것이다.
Car car2 = new Car("흰색");
//매개변수 1개있는 생성자 만들시 this(color ,"현대",4,100); 이런식으로 매개변수4개있는
//생성자가 호출될것이다.
// Car car3 = new Car("검정색","현대",4,200);
System.out.println(car);
System.out.println(car2);
}
}
※JAVA - 상속, 오버라이딩, 예외처리(간단)
1. 상속이란
1) 새로운 클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance) 받아서, 그 클래스의 속성(변수)과 기능(메서드)을 받아서 확장하여 클래스를 구현한다(부모의 생성자, 초기화블록은 제외)
2) 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현할 때 상속을 함.
3) 부모님 꺼도 내 거 , 내 거도 내 거...
- 단일상속만 가능(여러 부모 가질 수 없음)
- 조상부터 자손까지 계속 이어져서 상속 가능(부모가 상속받고 있으면 자식은 부모의 부모(조상)거까지 다 상속 가능)
- 자식이 변경되면 부모는 영향을 안 받음. 부모가 바뀌면 자식은 영향 다 받음
4) 클래스네임
- 상속하는 클래스: 상위 크래스, parent class, base class, super class라고 부름
- 상속받는 클래스: 하위 클래스, child class, derived class, sub class라고 부름
5) 상속의 문법
- class Parent {}
class Child extends Parent {}
* extends 키워드 뒤에는 딱 하나의 클래스만 올 수 있음
(자바는 단일상속만 지원)
* 상속관계에서 메서드나 변수가 재정의된 게 없으면 가장 가까운 부모클래스에서 그 기능이나 변수를 가지고 와서 사용한다.
* toString메서드는 클래스마다 재정의 해서 사용하는 게 좋다.
2. 오버라이딩
1) 상속받은 메서드의 내용을 변경하는 것(선언부( public void tmp(int age, String student) )는 그대로 따라 해야 함)
2) 오버라이딩 조건
1) 선언부는 반환타입, 메서드 이름, 매개변수 모두 조상과 동일해야 함 (구현부(내용)만 내 맘대로)
2) 접근제어자는 조상의 범위보다 같거나 크게 해야 함( public > protected > [default] > private )
3) 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
ex) 조상: public void gait() throws IOException, SQLException {}
자식: public void gait() throws IOException {}
※상속, 오버라이딩, 예외처리(간단) 예제
class Parent { //부모 클래스
int eyes = 2;
int nose = 1;
int mouse = 1;
int ears = 2;
String race = "황인종";
String name = "단군";
String gender = "남";
public void gait() throws IOException, SQLException {
System.out.println("팔자걸음");
}
@Override
public String toString() {
return "Parent{" +
"eyes=" + eyes +
", nose=" + nose +
", mouse=" + mouse +
", ears=" + ears +
", race='" + race + '\'' +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
class Child1 extends Parent { //자식클래스1 parent 클래스에게 상속받는중
// 아무것도 없는 자식
// Parent 의 속성및 기능들을 출력가능
}
class Child2 extends Parent { //자식클래스2 parent 클래스에게 상속받는중
//toString 선언하면 여기서 재정의된 변수들을 사용할수있다.
String name = "홍길동";
String gender = "여";
public void breath() {
System.out.println("죠낸 빠르게 숨쉰다");
}
@Override
public String toString() { //자식꺼에서 오버라이딩 한 변수를 출력하려면 Child2이클래스에서도 따로 toString 선언해야된다
// -> 이렇게 안하면 부모의 똑같이 정의된 toString 의 값이 출력될것이다 (부모의 변수들이 출력됨 ->Child2에서 오버라이딩된 변수들로 출력이안된다.)
return "Child2{" +
"eyes=" + eyes +
", nose=" + nose +
", mouse=" + mouse +
", ears=" + ears +
", race='" + race + '\'' +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
class GrandChild extends Child2 { //제일 낮은 상속받는 클래스 GrandChild
/* 오버라이딩
상속받은 메서드의 내용을 변경하는것(선언부는 그대로 따라해야함)
- 오버라이딩 조건
1) 선언부는 반환타입, 메서드 이름, 매개변수 모두 조상과 동일해야함 (구현부만 내 맘대로)
2) 접근제어제는 조상의 범위보다 같거 크게 해야함( public > protected > [default] > private )
3) 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
ex) 조상: public void gait() throws IOException, SQLException {}
자식: public void gait() throws IOException {}
*/
public void breath() {
System.out.println("죠낸 천천히 숨쉰다");
}
public void gait() throws IOException {
System.out.println("정상걸음");
}
}
public class Ex22_1_상속 {
public static void main(String[] args) throws SQLException, IOException {
Child1 c1 = new Child1();
System.out.println(c1);//Parent{eyes=2, nose=1, mouse=1, ears=2, race='황인종', name='단군', gender='남'}
System.out.println(c1.eyes); //2
System.out.println(c1.name); //단군
c1.gait(); //팔자걸음
System.out.println("----------------");
Child2 c2 = new Child2();
System.out.println(c2.race); //Child 2에선 race를 재정의한적이없으니 부모의'황인종'이출력
System.out.println(c2.eyes); //2
System.out.println(c2.name); //Child 2에선 name 을 '홍길동' 으로 재정의하였다. 이걸로출력됨.
c2.gait(); /* 오버라이딩을 한 경우 해당 클래스에서 메서드에 예외에 관련된걸 했을때 main 함수에서 메서드를 그냥 사용하면 에러남
해결방법: 1) main 메서드에 throws 로 걸었던 예외처리 문들을 걸어주면 됨
2) try catch 문을 이용하면 됨
*/
c2.breath(); //죠낸 빠르게 숨쉰다
System.out.println(c2);
//Child2{eyes=2, nose=1, mouse=1, ears=2, race='황인종', name='홍길동', gender='여'}
//naeme 과 gender는 Child2에서 재정의했기때문에 String 메서드 생성시 바뀐 변수의 리터널값으로적용됨.
System.out.println("----------------");
GrandChild gc1 = new GrandChild(); //parent(조상), child2(부모) 클래스에 속성 기능들 다 상속받는중
System.out.println("자손 눈 개수: " + gc1.eyes);//자손 눈 개수: 2
//
gc1.breath();//죠낸 천천히 숨쉰다
gc1.gait();//느린걸음
}
}
-> 메서드나 변수가 재정의된 게 없으면 가장 가까운 부모클래스에서 그 기능이나 변수를 가지고 와서 사용한다.
※JAVA - 상속(Object)
1) Object라는 모든 클래스의 조상인 클래스가 있다.
2) 우리가 별도로 extends를 이용해서 상속을 받지 않으면 컴파일러가 알아서 뒤에 'extends Object'라는 문구를 붙인 다.
-> 'extends Object' 문구는 생략이 되어있는 상태이다.
-> 모든 클래스의 조상 격이 Object 클래스에서 상속받는 중이라서 아래와 같이 Object클래스에서 정의된 메서드들도
쓸 수 있는 것이다.
3) Object 클래스에는 toString(), equals(), hashCode() 같은 기본으로 필요한 11개 메서드들이 정의되어 있다.
toString()-(출력문), equals()-(객체의 리터널 값이 같은지 비교), hashCode()- (객체의 메모리번지 같은지 비교)
4)그래서 우리가 toString()을 별도로 만들지 않아도 사용 가능한 거임.
-> 하지만 toSting() 메서드를 선언해 구현부를 재정의하면 더 자세히 출력가능하다.
※상속(Object) 예제
class A { //외부클래스
String str = "d여러분 복습은열??!!!!";
@Override
public String toString() {
//이렇게 toString() 메서드를 오버라이딩 할수있는거는 class A 가 Object클래스에서 상속받고있기
//때문이다.
return str;
}
}
public class Ex22_2_상속_Object { //메인클래스
public static void main(String[] args) {
A a = new A();
System.out.println(a.toString());
System.out.println(a); // toString() 생략 가능.
-> class A 가 Object클래스에서 상속받고 있는 상태이기 때문에 toString() 메서드를 오버라이딩 할 수 있는 것이다.
※JAVA - 포함관계(new 인스턴스 화한다는 뜻)
1) 상속 이외에도 클래스를 재사용하는 방법이 있고, 이것은 '포함'이라는 건데 사실 이건 많이 접했던 것이다.
한 클래스에서 다른 클래스를 인스턴스로 생성하면 됨.(new 한다는 것이다)
2) 공통되는 속성이나 기능들이 많지 않다면 상속보다는 포함관계를 추천한다.
이유: 상속은 하나밖에 못하기 때문, 상속하면 클래스 작성이 더 어려워짐.
* 포함관계인 경우 인스턴스를 타고 또 타서 실제 사용하려는 메서드나 변수까지 찾아가야 한다.
-> c22 안에 p22 안에 있는 eyes 변수를 사용 => c22.p22.eyes라고 말해줘야 함.
※포함관계(new 인스턴스 화 한다는 뜻) 예제
class Parent22 {
int eyes = 2;
int nose = 1;
int mouse = 1;
String race = "황인종";
String name = "단군";
public void gait() throws SQLException, IOException { //예외
System.out.println("팔자걸음");
}
}
class Child22 {
Parent22 p22 = new Parent22(); /* 포함관계 */
}
public class Ex22_3_포함관계 {
public static void main(String[] args) {
Child22 c22 = new Child22();
System.out.println(c22.p22.eyes);
/* 지금 mian에 Child22 를 new 인스턴스 객체를생성했고, Child22클래스안에는 Parent22클래스
의 객체를 생성한 p22라는 객체가있다. 그래서 c22 안에있는 p22의객체에 메서드나 변수를 사용하기
위해서는 c22.p22.eyes 이런식으로 객체를 2번타고 들어가서 안에 변수나 메서드를 뽑아낼수있다.*/
/* 포함관계인 경우 인스턴스를 타고 또 타서 실제 사용하려는 메서드나 변수까지 찾아 가야한다.*/
/* c22 안에 p22 안에 있는 eyes 변수를 사용 => c22.p22.eyes 라고 말해줘야함.*/
}
}
'국비교육' 카테고리의 다른 글
국비지원 60일차(JAVA - 다형성) (3) | 2023.10.18 |
---|---|
국비지원 59일차 (JAVA - 접근제어자, 캡슐화) (1) | 2023.10.17 |
국비지원 57일차(JAVA - 변수, 메서드) (2) | 2023.10.14 |
국비지원 56일차 (JAVA - 객체지향언어 ,클래스, 객체) (0) | 2023.10.13 |
국비지원 55일차 (JAVA - 배열) (0) | 2023.10.12 |