Person Array – Instance vs Static

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();

Lab3

Lab3 – ImageManipulatorTest (Due by 4/16)
이미지 5장을 이용해서, print/convert/resize등을 각종 이미지 변환을 수행한다.

Lab3 프로젝트 디렉토리 안에 모든 파일(src/*.java & bin/*.class)와 보고서(3-4장정도 – 장수제한없음)를 넣고 Lab3_학번_이름.zip 압축한 후 e-learning(http://lms.dankook.ac.kr/index.jsp)으로 제출

0 – ImageUtil (print, convert, resize, grayscale)

1 – enum ConvertMode (TO_JPG, TO_PNG, TO_GIF), ImageMode (PRINT, CONVERT, RESIZE)

2 – UserInput (getString, getInteger, getIntegerBetween, getImageMode, getConvertMode, getExitKey)

3 – ImageManipulatorTest (manipulate, print, convert, resize)

4 – array (String[] filenames), command line arguments, for, do-while(using UserInput), if/else, foreach, method (사용자 입력을 받아서 선택해서 각종 이미지 변환을 수행한다)

5 – 본인이 원하는 코드를 추가작성한다 (예를 들어, ImageUtil 클래스에 grayscale 메소드를 이용하여  ImageManipulatorTest에서 사용 등등)

1,2,3,4,5에 해당하는 부분을 /* 주석문 */으로 표시해준다.

보고서의 내용은 기존 코드 분석과 이해한 내용 그리고 본인이 추가한 코드내용을 적는다.

Java swap pass-by-value

static void swap(int p, int q) // Java uses pass-by-value
{
int t = p;
p = q;
q = t;
}

static void swap2(int[] p, int[] q) // Java uses pass-by-value
{
int t = p[0];
p[0] = q[0];
q[0] = t;
}

static void swap(int[] p, int[] q) // Java uses pass-by-value
{
int[] t = p;
p = q;
q = t;
}

static void swap2(int[][] p, int[][] q) // Java uses pass-by-value
{
int[] t = p[0];
p[0] = q[0];
q[0] = t;
}

static void swap(Point p, Point q) // Java uses pass-by-value
{
Point t = p;
p = q;
q = t;
}

static void swap2(Point p, Point q) // Java uses pass-by-value
{
double[] t = p.get(); // T t = p
p.set(q.get()); // p = q
q.set(t); // q = t
}

////////////////////////////////////////

public static void main(String[] args)
{
Point p1 = new Point(10.5, 10.7);
Point p2 = new Point(1.5, 1.7);

swap(p1, p2);
System.out.println(“After swap p1=” + p1 + ” p2 ” + p2); // p1=(10.5, 10.7) p2=(1.5, 1.7)
swap2(p1, p2);
System.out.println(“After swap2 p1=” + p1 + ” p2 ” + p2); // p1=(1.5, 1.7) p2=(10.5, 10.7)

int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 4, 5, 6, 7, 8 };
swap(arr1, arr2);
System.out.print(“arr1: “);
System.out.println(Arrays.toString(arr1)); // arr1: [1, 2, 3]
System.out.print(“arr2: “);
System.out.println(Arrays.toString(arr2)); // arr2: [4, 5, 6, 7, 8]

int[][] array1 = { new int[] { 1, 2, 3 } };
int[][] array2 = { new int[] { 4, 5, 6, 7, 8 } };
swap2(array1, array2);
System.out.print(“array1: “);
System.out.println(Arrays.toString(array1[0])); // array1: [4, 5, 6, 7, 8]
System.out.print(“array2: “);
System.out.println(Arrays.toString(array2[0])); // array2: [1, 2, 3]

int a = 10;
int b = 20;
swap(a, b);
System.out.println(“a=” + a); // a=10
System.out.println(“b=” + b); // b=20

int[] a2 = { 10 };
int[] b2 = { 20 };
swap2(a2, b2);
System.out.println(“a2=” + a2[0]); // a2 = 20
System.out.println(“b2=” + b2[0]); // b2 = 10
}

Java Parameter Passing: Pass-by-value only

//pass value type by value (값형식을 값에 의한 전달) – copy of value 전달

static void square1(int x) {
    x *= x;
    System.out.printf("The value inside square1: %d\n", x);
}

public static void main(String[] args) {
    int i = 5; 
    System.out.println("Before i=" + i);
    square1(i);
    System.out.println("After i=" + i + "\n\n");
}

//Before i=5
//The value inside square1: 25
//After i=5

//pass reference type by value (참조형식을 값에 의한 전달) – copy of reference 전달

static void square2(IntValue value) {
    value.x *= value.x;
    System.out.printf("The value inside square2: %d\n", value.x);
}

public static void main(String[] args) {
    int i = 5;
    IntValue value = new IntValue(i);
    System.out.println("Before value.x=" + value.x);
    square2(value);
    System.out.println("After value.x=" + value.x + "\n\n");
}

//Before value.x=5
//The value inside square2: 25
//After value.x=25

static void changeArray1(int[] arr) {
    arr[0]=888; // arr -> myArray이므로 원본 배열의 첫번째 값은 888로 변경
    System.out.println("changeArray1 arr=" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
    arr = new int[] {-3, -1, -2, -3, -4}; // local 변수로 새롭게 할당하여 지정 그러나 원본 배열 변경 안됨
    System.out.println("changeArray1 arr=" + Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining(",")));
}

public static void main(String[] args) {
    int[] myArray = {1, 4, 5};
    System.out.println("Before myArray=" + Arrays.stream(myArray).mapToObj(String::valueOf).collect(Collectors.joining(",")));
    changeArray1(myArray);
    System.out.println("After changeArray1 myArray=" + Arrays.stream(myArray).mapToObj(String::valueOf).collect(Collectors.joining(",")));
}

//Before myArray=1, 4, 5
//changeArray1 arr=888, 4, 5
//changeArray1 arr=-3, -1, -2, -3, -4
//After myArray=888, 4, 5

static void changeArray2(IntValue[] arr) {
    arr[0].x=888; // 원본 배열의 첫번째 값은 888로 변경
    System.out.println("changeArray2 arr=" + Arrays.stream(arr).map(Object::toString).collect(Collectors.joining(",")));
    arr = new IntValue[] { new IntValue(-3), new IntValue(-1), new IntValue(-2), new IntValue(-3), new IntValue(-4)};  // local 변수로 새롭게 할당하여 지정 그러나 원본 배열 변경 안됨
    System.out.println("changeArray2 arr=" + Arrays.stream(arr).map(Object::toString).collect(Collectors.joining(",")));
}

public static void main(String[] args) {
    IntValue[] myArray2 = { new IntValue(1), new IntValue(4), new IntValue(5)};
    System.out.println("Before myArray2=" + Arrays.stream(myArray2).map(Object::toString).collect(Collectors.joining(",")));
    changeArray2(myArray2);
    System.out.println("After myArray2=" + Arrays.stream(myArray2).map(Object::toString).collect(Collectors.joining(",")));
}

// Before myArray2=1, 4, 5
// changeArray2 arr=888, 4, 5
// changeArray2 arr=-3, -1, -2, -3, -4
// After myArray2=888,-4,5