728x90
1. 오버로딩(overloading)
- 한 클래스 안에 동일한 이름의 메서드를 여러 개 정의하는 것
- 기본은 하나의 메서드 이름 - 한 클래스 ⇒ 1 : 1
- 오버로딩하면 메서드 : 클래스 = N : 1
- 오버로딩이 성립하기 위한 조건 3가지
- 메서드 이름이 같아야 함
- 매개 변수의 개수, 순서, 타입이 달라야 함
- 반환 타입은 영향 X
- 메서드 중복 정의 : 똑같은 메서드를 2번 정의하는 것 => 오버로딩 X
int add(int a, int b) { return a+b }
int add(int x, int y) { return x+y }
- 오버 로딩
int add(long a, int b) { return a+b } => add(3, 3L)
int add(int x, long y) { return x+y } => add(4L, 4)
- 오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능 수행
- 즉, 오버 로딩이란 한 클래스 안에 동일한 이름의 메서드가 여러개 정의되어있는 것을 의미함.
public class Practice_26 {
public static void main(String args[]) {
MyMath mm = new MyMath();
System.out.println(mm.add(3, 3));
int[] a = {100, 200, 300};
System.out.println(mm.add(a));
}
}
class MyMath{
int add(int a, int b) {
System.out.print("int add(int a, int b) - ");
return a+b;
}
long add(long a, long b) {
System.out.print("long add(long a, long b) - ");
return a+b;
}
int add(int[] a) {
System.out.print("int add(int[] a) - " );
int result = 0;
for(int i=0; i< a.length; i++) {
result += a[i];
}
return result;
}
}
2. 생성자 - constructor
반드시 존재하거나, 없다면 자동으로 생성되어 실행됨
- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
- 여기서 인스턴스란 객체를 의미하며, 객체란 쉽게 이야기해서 IV 묶음 이라고 생각하면 된다.
- iv(인스턴스 벨류) 의 초기화란 "iv 값 정의" 라고 생각하면 편하다.
- 생성자는 IV 초기화를 편하게 하려고 만들어진 메서드
- IV 초기화
Time t = new Time(); => 생성자 호출
t.hour = 12;
t.minute = 34;
t.second = 56;
- 조금 변형 하자면 Time t = new Time(12, 34, 56); => 이것도 생성자
- 정확히는 매개 변수가 있는 생성자
2) 생성자 규칙
- 생성자 이름 = 클래스 이름
- return 리턴값이 없음 - void 안 붙임
- 모든 클래스는 반드시 생성자를 가져야 한다 => 생성자에 관하여 따로 코드를 작성하여 정의하는게 아닌 경우, 자동으로 기본 생성자가 생성됨
class Time{ // 클래스 명 Time
Time(int i, int j, int k) { // 매개 변수가 있는 생성자
// TODO Auto-generated constructor stub : 인스턴스 생성 시 수행될 코드
// 주로 인스턴스 변수의 초기화 코드를 적는다
System.out.println(i + j + k);
}
Time(){ // 매개 변수가 없는 생성자 => 기본 생성자
}
}
3) 기본 생성자 - default constructor
- 매개 변수가 없는 생성자
- 기본적으로는 개발자가 생성자를 추가해주어야 하나, 생성자가 하나도 없을 때는 컴파일러가 자동 추가
- 제대로 공부하기 위해서는 컴파일러가 자동으로 만들어주는 기능에 의지하지말고, 직접 만들어주는게 훨씬 더 좋음
class Data_1{ // 생성자가 하나도 없음 -> 컴파일러가 기본 생성자를 자동으로 만들어줌
int value;
}
class Data_2{
// 생성자가 이미 존재 -> 컴파일러가 기본 생성자를 자동으로 생성 X ->
// 컴파일러 오류를 해결하기 위해서는 기본생성자를 만들어줘야함
int value;
Data_2(){} // 기본 생성자
Data_2(int x){ // 매개 변수가 있는 생성자
value = x;
System.out.println(x);
}
}
4) 매개변수가 있는 생성자
- 매개 변수가 있는 생성자는 생성자에 매개변수를 넣어서 객체를 생성할 수 있도록 해준다.
- 이렇게 함으로써 인스턴스 생성시 변수를 쉽게 초기화 할 수 있고, 결과적으로 코드가 간결해진다.
- 매개변수 생성자의 실행 과정 : 참조변수 c 생성 -> new 연산자가 Car 객체 생성 -> 객체 초기화 && 생성자 호출 -> 각각 Blue, manual, 4 가 color, gearType, door 에 대입됨
public class Prcatice_26_2 {
public static void main(String args[]) {
// 생성자를 사용하지 않고 IV 초기화 하는 경우
Car c = new Car();
c.color = "White";
c.gearType = "auto";
c.door = 2;
System.out.println(c.color +" | "+ c.gearType +" | "+ c.door);
// 생성자를 사용하는 경우
Car c1 = new Car("Blue", "manual", 4);
System.out.println(c1.color + " | " + c1.gearType + " | "+ c1.door);
}
}
class Car{
// IV : 인스턴스 변수
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car(){};
Car(String c, String g, int d){
color = c;
gearType = g;
door = d;
}
}
////////////// 출력 ////////////////////////////
White | auto | 2
Blue | manual | 4
5) 생성자 this()
- 생성자에서 다른 생성자를 호출할 때 사용 => 코드의 중복을 제거하기 위해 사용
- 같은 클래스 안에서 다른 생성자를 호출하는 경우 사용됨
- 다른 생성사 호출 시 첫 줄에서만 사용 가능
class Game{
String name; // 이름
String classful; // 직업
int level; // 레벨
Game(String n, String c, int l){
name = n;
classful = c;
level = l;
}
Game(){
// 기본 생성자에 this 로 위의 Game 생성자를 호출하면
// 기본적으로 객체 생성 시 기본생성자에서 this 안에 정의 해 둔 값으로 초기화 됨 => 방법 1과 방법 2는 동일한 기능
// 방법 1
this("기본이름", "기본직업", 0);
// 방법 2
// this.name = "기본이름";
// this.classful = "기본직업";
// this.level = 0;
}
}
public class Prcatice_26_2 {
public static void main(String args[]) {
// Game 객체를 생성하고 따로 값을 넣어주지 않는 경우 출력되는 것은 기본 생성자에서 this() 안에 넣어둔 값과 같다
Game g = new Game();
System.out.println(g.name + " | " + g.classful + " | "+ g.level);
}
}
//////////// 출력 ///////////
기본이름 | 기본직업 | 0
- 이때 방법 1은 코드의 중복을 제거하고 보다 간결해지게 작성된 코드이다.
6) 참조변수 this
- 인스턴스 자신을 가리키는 참조변수 => 위의 생성자 this() 와는 전혀 다른 개념임
- 인스턴스 메서드(생성자 포함)에서 사용 가능
- 지역변수(lv) 와 인스턴스 변수(iv) 를 구별할 때 사용 => 물론 이 외에도 여러 방면에서 사용됨
- Computer 클래스를 생성하고 인스턴스 변수 cpu, graphicCard, memory 를 설정하였다.
- Computer() 기본생성자와 Computer(매개변수) 인 생성자 2개를 각각 만들었다.
- 이때 Computer(매개변수) 생성자에서 참조변수 this. 을 사용하여 클래스 단에서 정의된 인스턴스 변수 cpu, graphicCard, memory 와 매서드 매개변수로 설정된 지역변수 cpu, graphicCard, memory 를 구분하였다.
- 이후 Computer 객체를 기본생성자를 호출하여 만드는 경우 와 매개변수를 포함하는 생성자를 호출하여 만드는 경우의 각각 출력 형태를 비교해보았다.
class Computer{
String cpu;
String graphicCard;
int memory;
// Computer(String c, String g, int m){
// // 이때 지역 변수(lv)는 c, g, b && 인스턴스 변수(iv)는 cpu, graphicCard, board
// // 현재는 지역 변수명과 인스턴스 변수명이 서로 다르기 때문에 iv 앞에 this. 가 안붙어도 상관X
// cpu = c;
// graphicCard = g;
// memory = m;
// }
Computer(String cpu, String graphicCard, int memory){
// 이때 지역 변수(lv)는 cpu, graphicCard, board && 인스턴스 변수(iv)는 cpu, graphicCard, board
// 지역 변수명과 인스턴스 변수 명이 서로 동일!! 이 때문에 지역 변수와 인스턴스 변수 구분을 위해 인스턴스 변수 앞에 this. 사용
this.cpu = cpu;
this.graphicCard = graphicCard;
this.memory = memory;
}
Computer(){ // 기본 생성자 활용
this("Amd", "RTX2060", 16);
}
}
public class Prcatice_26_2 {
public static void main(String args[]) {
Computer com1 = new Computer(); // 기본 생성자 호출
System.out.println(com1.cpu + " | " + com1.graphicCard + " | " + com1.memory);
Computer com2 = new Computer("Intel", "RTX2070", 8); // 매개변수를 포함하는 생성자 호출
// 이렇게 하면 아래와 같이 정의한 것과 동일함
// com2.cpu = "Intel";
// com2.graphicCard = "RTX2070";
// com2.memory = 8;
System.out.println(com2.cpu + " | " + com2.graphicCard + " | " + com2.memory);
}
}
가장 중요한 부분!!
1. 생성자는 기본 생성자와 매개 변수가 있는 생성자로 구분된다.
- 기본 생성자 : 매개변수를 갖지 않으며, 해당 클래스의 인스턴스 객체가 생성될 때 가장 먼저 실행되는 메서드. 만약 직접 작성하지 않는다면 있는 것으로 취급하고 실행됨
- 매개 변수를 갖는 생성자 : 인스턴스 객체가 생성될 때 매개 변수를 통해 인스턴스 변수(필드 변수) 를 초기화 해 줌.
2. 참조변수 this. 와 생성자 this()
- this. : 인스턴스 자신이 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
- this() , this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출 할 때 사용된다. 매개 변수 명과 인스턴스 변수 명이 동일한 경우, this 를 생략하면 안된다
'Java - 기본기' 카테고리의 다른 글
18-2 메소드 : 메소드 반환 타입, 오버로딩, 매개변수, 호출방식 (0) | 2022.02.24 |
---|---|
20. 컬렉션 프레임워크 : list, set, map 간단 하게 알아보기 (0) | 2022.02.07 |
18. 메소드 : 선언부와 구현부, 메서드 호출, return문, 반환값 (0) | 2021.10.26 |
17. 변수 선언위치에 따른 변수의 종류 : 클래스 변수 && 인스턴스 변수 (0) | 2021.10.26 |
16. 객체 배열, 클래스의 정의 (0) | 2021.10.22 |
댓글