PersonTest-InstanceStatic – instance member field & method vs static member field & method
public class Person {
String name; // instance member field
int age; // instance member field
public Person() { // default constructor
this("JAVA17", 2017); // call Person(String n, int a);
}
public Person(String name, int age) { // constructor
this.name = name;
this.age = age;
}
public void setName(String name) { // instance method
this.name = name;
}
public void setAge(int age) { // instance method
this.age = age;
}
public String getName() { // instance method
return name;
}
public int getAge() { // instance method
return age;
}
public void print() { // instance method
System.out.println("Person Name=" + name + " Age=" + age);
}
@Override
public String toString() { // instance method
return "Person Name=" + name + " Age=" + age;
}
}
public class Person2 {
static String name; // static member field
static int age; // static member field
public Person2() { // default constructor
this("JAVA17", 2017); // call Person2(String n, int a);
}
public Person2(String n, int a) { // constructor
name = n;
age = a;
}
public static void setName(String n) { // static method
name = n;
}
public static void setAge(int a) { // static method
age = a;
}
public static String getName() { // static method
return name;
}
public static int getAge() { // static method
return age;
}
public static void print() { // static method에서는 this 사용 불가
System.out.println("Person Name=" + name + " Age=" + age);
}
@Override
public String toString() {
return "Person Name=" + name + " Age=" + age; // instance method에서는 static member variable 접근 가능
}
}
public class Person3 {
static String name; // static member field
static int age; // static member field
private Person3() { // private default constructor
}
public static void setName(String n) { // static method
name = n;
}
public static void setAge(int a) { // static method
age = a;
}
public static String getName() { // static method
return name;
}
public static int getAge() { // static method
return age;
}
public static void print() { // static method에서는 this 사용 불가
System.out.println("Person Name=" + name + " Age=" + age);
}
}
public class PersonTest {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
Person[] pArray = new Person[3]; // 만약 Person 객체를 하나만 생성한 후 for문에서 공유해 사용할 경우 // 마지막으로 입력된 데이터로 모든 데이터값이 치환됨 Person p = new Person();
for (int i = 0; i < 3; i++) {
System.out.print("\n\nEnter Person name and age : ");
p.setName(input.next()); // 입력정보
p.setAge(input.nextInt()); // 입력정보
p.Print();
pArray[i] = p; //배열에 들어간 모든 원소는 동일한 p
}
System.out.println("pArray : " + Arrays.toString(pArray));
Person[] pArray1 = new Person[3]; // 아래와 같이 for문 안에 Person p = new Person()와같이 // 새로운 객체를 생성해야 각자 다르게 입력된 정보가 들어가게 됨
for (int i = 0; i < 3; i++) {
Person p1 = new Person();
System.out.print("\n\nEnter Person name and age : ");
p1.setName(input.next()); // 입력정보
p1.setAge(input.nextInt()); // 입력정보
p1.Print();
pArray1[i] = p1; // p1는 새로운 Person객체이므로 배열에서 각각 다른 원소가 들어간다
}
System.out.println("pArray1 : " + Arrays.toString(pArray1));
// 만약 Person2 객체의 name과 age는 static이라서,
// static은 공유하는 것이므로, 마지막으로 입력된 데이터로 모든 데이터값이 치환됨
Person2[] pArray2 = new Person2[3];
for (int i = 0; i < 3; i++) {
Person2 p2 = new Person2();
System.out.print("\n\nEnter Person name and age : ");
p2.setName(input.next()); // Person2.setName(input.next())와 동일
p2.setAge(input.nextInt()); // Person2.setAge(input.nextInt())와 동일
pArray2[i] = p2; // p2 객체의 name과 age는 static이므로 모두 공유하기때문에, 배열의 모든 원소는 마지막에 들어간 정보로 셋팅
}
System.out.println("pArray2 : " + Arrays.toString(pArray2));
Person3[] pArray3 = new Person3[3]; // Person3 타입의 배열생성 OK
for (int i = 0; i < 3; i++) {
//Person3 p3 = new Person3(); // error Person3() has private access
System.out.print("\n\nEnter Person name and age : ");
Person3.setName(input.next()); // p3.setName(input.next()) 사용을 못하게 함
Person3.setAge(input.nextInt()); // p3.setAge(input.nextInt()) 사용을 못하게 함
//pArray3[i] = p3; // error p3 객체를 생성할 수 없으므로 사용 불가능
}
Person3.print();