참조형 인자값과 참조형 반환타입
지금까지는 반환 타입이 int, double과 같은 기본자료형 타입이었지만 이번에는 참조형 타입으로 반환타입을 지정해 봤다. 다른 메소드에서 만든 참조형을 어떻게 메인에서 받아 처리할 수 있을까?
전체 코딩 훑기
public static void main(String[] args) {
//참조형 리턴타입
Data d = new Data();
d.x = 11;
d.y = 22;
Data d2 = copy(d);
// d = d2;
// d2.x = 33;
// d2.y = 44;
System.out.println("d.x : " + d.x);
System.out.println("d.y : " + d.y);
System.out.println("d2.x : " + d2.x);
System.out.println("d2.y : " + d2.y);
}
static Data copy(Data d)
{
Data tmp = new Data();
tmp.x = 33;
tmp.y = 44;
return tmp;
}
}
class Data{
int x;
int y;
}
class Data{
int x;
int y;
}
가장 하단에 있는 Data 클래스부터 보자면 인스턴스 변수가 x, y 두 개로 선언 됨
public static void main(String[] args) {
Data d = new Data();
d.x = 11;
d.y = 22;
//참조형 리턴타입
Data d2 = copy(d); //카피 메소드.
// d = d2;
// d2.x = 33;
// d2.y = 44;
//메소드의 경우 바로 호출이니까 클래스 메소드
System.out.println("d.x : " + d.x);
System.out.println("d.y : " + d.y);
System.out.println("d2.x : " + d2.x);
System.out.println("d2.y : " + d2.y);
}
메인에서는 객체 생성을 통해서 Data 클래스 값들을 불렀다.
객체 명은 d로 변수 설정을 해주기 위해서 d.x와 d.y를 선언함
Data d2 = copy(d);
두번째 객체 생성을 하면서 카피 메소드를 대입함
** 아래를 먼저 읽고 이후를 읽어야 한다. **
카피 메소드
시작 주소값을 준다. 그래서 층을 같이 바라보게 돼 같은 값을 갖게 된다. 하지만 여기에서 주는 d의 경우 지역변수 이기 때문에 카피 메소드를 사용하고 나서 없어지는 값이다.
static Data copy(Data d)
{
Data tmp = new Data();
tmp.x = 33;
tmp.y = 44;
return tmp;
}
}
static Data copy(Data d)
선언부만 봐도 어떤 타입의 메소드인지 감이 잡힌다. 리턴타입이 Data로 참조형 반환타입이고, 매개변수에 참조형이 들어와 있다. 이 메소드를 쓰기 위해서는 반드시 타입과 개수를 맞춰서 인자값으로 넘겨줘야한다. 그러니 이 클래스 메소드는 참조형을 받아서 참조형을 반환한다는 뜻이다.
Data tmp = new Data();
지금처럼 클래스 객체를 쓰고 싶다면 객체 생성을 해서 넘거야한다.
Data 클래스의 객체 생성을 해서 x, y의 방이 생겼다.
tmp.x = 33;
tmp.y = 44;
각 값을 셋팅해주었다.
return tmp;
d를 넣어주는 것도 가능하다. 물론 d와 tmp는 다른집으로 안에 있는 주소만 같다. 지역변수는 나가면 없어지니까 d를 리턴할 경우 카피를 호출한 메인에서는 사용하지 못 한다. d가 갖고 있는 걸 tmp로 옮긴 것 뿐이니까 값은 같다. 그래서 카피 메소드임!!
매개변수와 리턴타입 Data 구현 방법이 틀은.. 같을 수 있고 다를 수도 있다.
d.x : 11 d.y : 22 d2.x : 33 d2.y : 44 |
같은 클래스 안에 클래스 메소드와 인스턴스 메소드가 있다면?
public static void main(String[] args) {
System.out.println("클래스 메소드 호출");
//200 100 클래스 메소드 호출
System.out.println(MyMath.add(200,100));
System.out.println(MyMath.substract(200,100));
System.out.println(MyMath.multiply(200,100));
System.out.println(MyMath.divide(200, 100));
System.out.println("======================");
System.out.println("인스턴스 메소드1 호출 ");
MyMath m = new MyMath();
m.a = 200;
m.b = 100;
System.out.println(m.add());
System.out.println(m.substract());
System.out.println(m.multiply());
System.out.println(m.divide());
System.out.println("======================");
System.out.println("인스턴스 메소드2 호출 ");
//2인스턴스 500, 300
MyMath m2 = new MyMath();
m2.a = 500;
m2.b = 300;
System.out.println(m2.add());
System.out.println(m2.substract());
System.out.println(m2.multiply());
System.out.println(m2.divide());
}
}
class MyMath
{
int a, b;
int add()
{
return a + b;
}
//매개변수 없음
int substract()
{
return a - b;
}
int multiply()
{
return a * b;
}
double divide()
{
return a / b;
}
static int add(int a, int b) //
{
return a + b;
}
// static int add2() //int a, int b
// {
// MyMath mm = new MyMath();
// mm.a = 5;
// mm.b = 10;
// return mm.a + mm.b;
// }
static int substract(int a, int b) //
{
return a - b;
}
static int multiply(int a, int b) //
{
return a * b;
}
static double divide(double a, double b) //
{
return a / b;
}
}
같은 클래스 안에 인스턴스 메소드, 클래스 메소드가 들어 있다!!
인스턴스 변수의 경우 매개변수가 없이 바로 return 값으로 a, b 반환값을 넘겨 주었고,
클래스 변수의 경우 매개변수 a와 b 두 가지를 받아와서 계산을 해주었다.
인스턴스 메소드에서는 클래스 메소드를 자유자재로 불러서 사용할 수 있지만, 클래스 메소드에서는 인스턴스 메소드를 바로 사용할 수 없고 사용하기 위해서는 객체 생성을 한 뒤에 사용할 수 있다. 클래스 메소드의 경우 매개변수가 있어야 하고, 없으면 오류가 난다.
ex) Scanner 객체의 경우에도 인스턴스 단위 라서 맨날 객체 생성을 하고 불러줘야 한다. jdk에서 객체 생성을 하지 않고 사용하는 메소드들이 있는데 그것은 모두 클래스 메소드 라서 객체 생성을 하지 않아도 된다. 인스턴스 단위로 객체 생성을 할 때마다 집이 다 다르고 다른 곳을 보고 있다.
System.out.println(MyMath.divide(200, 100));
//인스턴스 메소드 부분
double 타입이지만 200, 100으로 정수를 주었다. 이렇게 되면 강제 형변환이 된다.
System.out.println(m.add(500, 200));
//클래스 메소드 부분
문법적으로 문제가 없지만 클래스 메소드이기 때문에 정식으로는 m.이 아니라 MyMath.가 와야한다. 매개 변수 없는 게 오려면 반드시 객체 생성을 해줘야만한다.
System.out.println(MyMath.add(200,100));
System.out.println(m.add());
System.out.println(m.add(500, 200));
이 세 개 중에서 같은 것은 1, 3번인 클래스 메소드이다. 그것을 어떤 걸로 구분을 하냐면 인자값이 들어 있는 것이 클래스 메소드인데 클래스 부분을 보면 바로 알 수 있다. 왜냐하면? 인스턴스 메소드의 경우 매개변수 값이 들어있지 않고, 클래스 메소드에만 매개변수 두 개가 들어있기 때문이다.
2는 인스턴스 메소드이다.
3번의 경우도 클래스 메소드이지만 잘 보면 m.add로 되어 있다. 이 부분도 문법적으로는 문제가 없지만 정식으로는 m.대신에 MyMath가 와야한다!
클래스 메소드 : MyMath.
인스턴스 메소드 : m.
왜 목록이 다른지 ...
소소한 Tip
배열 : 선언과 동시에 사이즈 고정이 되는 게 단점이다.
java project 만들 때 JRE : javaSE-1.8 버전 확인
내가 주민 메소드를 만들어 처리하기 위해서는
매개변수로 String으로 주민 번호를 받음(반드시:매개변수 특징)
리턴 타입으로( char ) 남자? 여자? 체크만 해서 넘기면 된다.
'개발일지 > Java + Spring' 카테고리의 다른 글
211027 Java - 생성자를 통한 인스턴스 복사 (1) (0) | 2021.10.27 |
---|---|
메소드 오버로딩 (0) | 2021.10.26 |
211022 Java - 메소드(클래스/인스턴스/기본형/참조형) (0) | 2021.10.22 |
클래스 파일 확인 - 같은 파일에 있는 클래스가 나눠져서 저장? (0) | 2021.10.21 |
211021 java - 다차원 배열과 객체 (0) | 2021.10.21 |