/*=====================================================
■■■ 메소드 중복정의 (Method Overloading) ■■■
=====================================================*/
// 클래스영역 안에 같은 메소드를 여러 개 정의할 수 있을까? 외부에서 Test() {}
// 이름이 같더라도 매개변수가 다르면 구분하도록 하자(매개변수의 타입이나 개수)
// 메소드 오버라이딩과 구분해야 함 오버로딩과 오버라이딩의 차이를 구분해야 한다.
/* ● 메소드 중복정의의 개요
메소드 중복정의 (Method Overloading) 란 메소드가 처리하는 기능은 같고(혹은 매우 유사하고)
메소드 괄호 속에 넘겨주게 되는 인수(인자, 매개변수, 파라미터)의 개수가 다르거나
자료형(Data type)이 다른 경우 메소드의 이름을 동일한 이름으로 사용해도
이들을 서로 구분(식별)할 수 있기 때문에 동일한 이름을 부여하여
메소드를 정의할 수 있도록 문법적으로 허용하게 되는데 이를 『메소드 오버로딩』이라고 한다.*/
/*
System.out.pritnln();
System.out.pritnln('C');
System.out.pritnln(30);
System.out.pritnln(12.3455);
System.out.pritnln("옴뇸뇸");
과연 이게 모두 같은 메소드일까? 아니다!
(이름만 같은) 모두 다른 메소드이다.
System.out.println() 은 같지만 어떤 매개변수를 넣느냐에 따라서 출력결과가 달라진다.
*/
public class Test076
{
public static void main(String[] args)
{
Test076 ob = new Test076();
/* ob.drawLine(); //-==>> ====================
ob.drawLine('+'); //-==>> ++++++++++++++++++++
ob.drawLine('-',20); //-==>> --------------------
*/
ob.drawLine(); //====================
ob.drawLine('>'); //>>>>>>>>>>>>>>>>>>>>
ob.drawLine('*',40); //****************************************
}// end main()
// 선을 그리는 메소드 정의
public void drawLine()
{
System.out.println("===================="); // =가 20개있음
}
//선의 형태를 바꾸어 그리는 메소드
//public void drawLine2(char c) → 메소드의 이름을 drawLine2, drawLine3로 하지 않아도 4
//인수의 타입이나 개수가 다르기 때문에 구분이 된다. 따라서 이름이 같아도 구분이 가능해진다.
public void drawLine(char c)
{
for (int i =0; i<20; i++)
{
System.out.print(c);
}
System.out.println();
}
//public void drawLine3(char c, int n)
public void drawLine(char c, int n)
{
for (int i=0; i<n; i++)
{
System.out.print(c);
}
System.out.println();
}
}
/*==========================================
■■■ 클래스와 인스턴스 ■■■
- 생성자 (Constructor)
===========================================*/
public class Test077
{
int x;
// ※ 생성자의 이름은 항상 예외없이 클래스의 이름과 동일해야 하며 필요할 경우 인수를 받아들이는 것도 가능하고
// 같은 이름의 메소드를 정의하는 중복정의가 가능하지만 리턴 값(반환 값)은 가질 수 없다.
// ※ 생성자는 다른 일반 메소드들처럼 호출될 수 없고, new 연산자를 이용하여 객체를 생성하기 위해 호출되며
// 생성된 객체의 멤버를 초기화시키는 작업을 수행한다.
Test077()
{
int x = 10;
System.out.println("생성자 호출 - 인자가 없는 생성자");
}
Test077(int x)
{
//x = x; // 이건 가능할까? x가 위의 x인지 인자로 받은 인수인지 모르는데?
//문법적으로는 가능하다. 컴파일도 된다.
//앞의 x는 멤버변수 x이고, 뒤 x는 매개변수 int x임 . 둘을 구분하기 위해서 this를 쓴다!!!!!
//여기서 this의 의미, 즉 이곳! 은 이 클래스이다.
this.x = x;
System.out.println("생성자 호출 - 인자가 있는 생성자");
}
//이름이 같은 메소드 Test077
public static void main(String[] args)
{
//Test077 클래스 기반의 인스턴스 생성
Test077 ob1 = new Test077();
Test077 ob2 = new Test077(100);
/*생성자 호출 - 인자가 없는 생성자
생성자 호출 - 인자가 있는 생성자
계속하려면 아무 키나 누르십시오 . . .*/
// ※ 생성자는 new연산자를 이용하여 객체를 생성하기 위해 호출되며
//클래스 객체에 대한 인스턴스가 생성되면 이 객체는 비로소 메모리를 할당 받게 된다.
System.out.println("main 에서 ob1.x : " + ob1.x); //-=>> main 에서 ob1.x : 0
System.out.println("main 에서 ob2.x : " + ob2.x); //-==>> main 에서 ob2.x : 100
/*==========================================
■■■ 클래스와 인스턴스 ■■■
- 생성자 (Constructor)
===========================================*/
public class Test078
{
int val1;
double val2;
Test078()
{
val1=0;
val2=0;
System.out.println("매개변수 없는 생성자 호출!");
}
Test078(int val1)
{
this.val1=val1;
val2=0;
System.out.println("int형 매개변수를 넘겨받는 생성자 호출!!");
}
Test078(double val2)
{
val1=0;
this.val2=val2;
System.out.println("double형 매개변수를 넘겨받는 생성자 호출!!");
}
Test078(int val1, double val2)
{
this.val1=val1;
this.val2=val2;
System.out.println("int 와 double형 매개변수를 넘겨받는 생성자 호출!!");
}
public static void main(String[] args)
{
Test078 ob1 = new Test078();
Test078 ob2 = new Test078(9);
Test078 ob3 = new Test078(9.0);
Test078 ob4 = new Test078(9, 9.0);
System.out.println(ob1.val1 + " , " + ob1.val2);
System.out.println(ob2.val1 + " , " + ob2.val2);
System.out.println(ob3.val1 + " , " + ob3.val2);
System.out.println(ob4.val1 + " , " + ob4.val2);
}
/*
매개변수 없는 생성자 호출!
int형 매개변수를 넘겨받는 생성자 호출!!
double형 매개변수를 넘겨받는 생성자 호출!!
int 와 double형 매개변수를 넘겨받는 생성자 호출!!
0 , 0.0
9 , 0.0
0 , 9.0
9 , 9.0
계속하려면 아무 키나 누르십시오 . . .
*/
}
/*========================================================
■■■ 클래스와 인스턴스 ■■■
- 생성자 (Constructor) 와 초기화 블럭 (Initialized Block)
========================================================*/
public class Test079
{
int n;
int m;
//n=100;
//m=200;
// ↑ 이렇게 하는거 당연히 될 것 같은 데 왜 안되지?
// 그런데 int n=100; 이렇게 선언과 동시에 초기화하는 것은 된다!
// ★ 지금 작업하고 있는 영역은 클래스영역임을 잊지않기로
{
n=100;
m=200;
System.out.println("초기화 블럭 실행...");
}
// 그런데 이건 또 된다,,!
// 이 블레이스가 바로 초기화블럭이다 (Initialized Block)
// 인스턴스 생성만 하고 나서 컴파일 해보면 출력구문이 나온다.
// 컴파일 과정에서 초기화블럭이 실행된다는 의미
Test079()
{
n=0;
m=20;
System.out.println("생성자 실행");
}
void write()
{
System.out.println("n : " + n + " m : " + m);
}
/*초기화 블럭 실행...
생성자 실행
계속하려면 아무 키나 누르십시오 . . .*/
//컴파일 하면 이렇게 된다. 생성자의 위치와 초기와 블럭의 위치를 바꿔도 출력결과는 같다..
//즉, 인스턴스를 생성하면 ★생성자보다 초기화블럭이 먼저 실행된다!!!!!!!! 왜 그럴까?
//초기화블럭이 더 중요해서? 초기화 블럭이 힘들게 초기화시켜놔도 생성자가 설정한 값들로 설정이 되는 것이다.
//생성자가 나중에 실행되는 이유는, 생성자 실행 내용이 더 비중이 크기 때문이다.
Test079(int n, int m)
{
this.n=n;
this.m=m;
System.out.println("인자가 있는 생성자 실행");
}
public static void main(String[] args)
{
Test079 ob = new Test079();
ob.write();
System.out.println("\n"); //두 줄 개행
Test079 ob2 = new Test079(123,234);
ob2.write();
/*
초기화 블럭 실행...
생성자 실행
n : 0 m : 20
초기화 블럭 실행...
인자가 있는 생성자 실행
n : 123 m : 234
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
'📚Study Note > JAVA' 카테고리의 다른 글
[ JAVA ] 배열 Array ② 배열의 배열(2차원 배열) (0) | 2021.03.14 |
---|---|
[ JAVA ] 배열 Array 의 선언, 초기화, 기본적인 사용 (0) | 2021.03.14 |
[ JAVA ] 클래스와 인스턴스 ② 생성자 (Constructor) (0) | 2021.03.14 |
[ JAVA ] 클래스와 인스턴스 ① (0) | 2021.03.14 |
[ JAVA ] break ; / continue; / return; (0) | 2021.03.13 |