728x90
반응형
오늘은 제목 그대로의 상황을 살펴보도록 하겠다.
먼저 Main.class와 별개로 Person, Member라는 클래스를 만들었고
Member 클래스에는 Person 클래스의 참조변수가 있다고 염두해두자.
이 예제는 임의로 같은 패키지안에서 작업했다.
먼저 Person 클래스이다.
public class Person {
String name;
int age;
//생성자 : Constructor
public Person() {
name = "익명";
age = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//멤버값을 출력하는 메소드
void show() {
System.out.println("name : " + name);
System.out.println("age : " + age);
}
//멤버값 입력하는 메소드
void setMembers(String name, int age) {
this.name = name;
this.age = age;
}
}
가장 먼저 생성자 2개가 오버로딩 되어있다. 아무런 값도 설정하지 않으면 이름은 익명, 나이는 0으로 설정될 것이다.
다른 하나는 입력된 이름과 나이 값으로 멤버 변수를 설정하는 생성자이다.
그리고 나머지 두 개는 주석과 같이 멤버값을 입출력하는 메소드이다.
다음은 Member 클래스이다.
public class Member {
int no; //회원번호
Person p; //회원의 개인정보 [이름, 나이] 저장
//생성자 : Constructor
public Member() {
no = 0;
p = new Person(); //"익명", 0
}
public Member(int no, Person p) {
this.no = no;
this.p = p;
}
public Member(int no, String name, int age) {
this.no = no;
this.p = new Person(name, age);
}
//멤버값을 전달받아 멤버변수에 대입해주는 메소드
void setMembers(int no, Person p) {
this.no = no;
this.p = p;
}
//멤버값 전달받는 메소드 오버로딩
void setMembers(int no, String name, int age) {
this.no = no;
//this.p.name = name;
//멤버 p는 현재 null상태이므로 바로 값을 대입하는 것이 아니라 Person객체를 생성해야 한다
this.p = new Person();
this.p.setMembers(name, age);
}
//멤버값을 출력하는 메소드
void show() {
System.out.println("no : " + no);
//멤버인 Person객체가 스스로 본인 값을 출력하는 메소드가 있다
//그 객체의 출력 기능을 그대로 사용
p.show();
}
}
먼저 Member 클래스는 Person 클래스에 추가로 회원번호까지 저정하는 클래스이다.
여기서 setMembers는 Person 클래스에 바로 이름과 나이를 설정할 수도 있지만 이름과 나이를 파라미터에 설정할 수도 있다.
이 또한 메소드 오버로딩이 되어있는 모습이다.
마지막으로 Main 클래스이다. 여기서 Person, Member 클래스를 사용하는 모습을 보려고 한다.
public class Main {
public static void main(String[] args) {
//class안에 다른 클래스의 참조변수가 멤버로 있는 경우에 대한 고려사항
Member m = new Member();
System.out.println(m.no); //0
System.out.println(m.p); //null
System.out.println();
//멤버 값 대입
m.no = 10;
m.p = new Person(); //객체를 생성하여 참조변수에 대입
System.out.println(m.no); //10
System.out.println(m.p); //참조값의 .toString()
System.out.println();
//멤버변수로 존재하는 또 다른 객체의 멤버값까지 출력해줘야 한다
System.out.println(m.p.name);
System.out.println(m.p.age);
System.out.println();
//결국 멤버변수로 존재하는 다른 객체의 멤버값도 대입해 주어야 함
m.p.name = "sam";
m.p.age = 20;
System.out.println(m.no);
System.out.println(m.p.name);
System.out.println(m.p.age);
System.out.println();
//위처럼 출력하는게 번거로움
//객체지향은 객체의 값을 객체 스스로 출력시킨다
//Person객체의 값을 Person객체가 스스로 출력하는 기능이 있다면
//Person class에 멤버값을 출력하는 메소드 만들기
System.out.println(m.no);
m.p.show();
System.out.println();
//이런 식이면 Member class도 멤버값 출력 기능 만들 수 있다
m.show();
System.out.println();
//이런 기능들이 있다면 새로운 객체를 만들어도 쉽게 코딩가능
Member m2 = new Member();
m2.no = 11;
m2.p = new Person();
//m2.p.name = "robin";
//m2.p.age = 25;
//Person의 멤버값 입력을 일일이 하는 것은 번거로움
//Person의 멤버값을 한 번에 전달해서 입력해주는 기능이 있다면
m2.p.setMembers("robin", 25);
m2.show();
System.out.println();
//이러고 보니 Member class도 입력 기능이 있다면 한 번에 값 전달이 가능
Member m3 = new Member();
Person pp = new Person();
pp.setMembers("hong", 30);
m3.setMembers(12, pp);
m3.show();
System.out.println();
//가만 보니 결국 Member 객체의 입력값들은 [번호, 이름, 나이]
//따라서 애초에 입력기능을 만들 때 3개의 값을 입력받을 수 있도록 하는 것이 더 적합해보인다
Member m4 = new Member();
m4.setMembers(13, "park", 35);
m4.show();
System.out.println();
//객체 생성 후 멤버값을 대입하기 위해 매번 메소드를 호출하는 코드가 필요
//객체 생성 시 멤버값을 한 번에 대입해주는 기능을 만든다
//객체 생성 시 자동으로 한 번 호출되는 특별한 메소드 : Constructor
Member m6 = new Member();
m6.show();
Member m7 = new Member(14, new Person("lee", 40));
}
}
728x90
반응형
'Language > Java' 카테고리의 다른 글
자바의 상속 - 1 (0) | 2022.05.04 |
---|---|
static 키워드 (0) | 2022.05.01 |
자바의 생성자(Constructor) (0) | 2022.04.29 |
자바의 접근 제한자(Access Modifier) (0) | 2022.04.28 |
자바의 변수 종류 (0) | 2022.03.25 |