Objects

정소이·2023년 1월 23일
0

OOP를 향해서

목록 보기
9/10

일반적인 자바 프로그램은 메서드 호출로 상호작용하는 객체를 많이 만든다. 이런 객체의 상호작용으로 프로그램은 GUI 구현, 애니메이션 실행, 네트워크로 정보를 주고받는 등 다양한 작업을 수행할 수 있다. 객체가 생성된 작업을 완료하면, 그 리소스들은 다른 객체에서 사용할 수있도록 재활용된다.

package objects;

import java.awt.*;

public class CreateObjectDemo {
    public static void main(String[] args) {

        Point originOne = new Point(23, 94);
        Rectangle rectOne = new Rectangle(originOne, new Dimension(100,200));
        Rectangle rectTwo = new Rectangle(50, 100);

        System.out.println("Width of rectOne: " + rectOne.width);
        System.out.println("Height of rectOne: " + rectOne.height);
        System.out.println("Area of rectOne: " + rectOne.getWidth()*rectOne.getHeight());

        rectTwo.setLocation(originOne);

        System.out.println("X Position of rectTwo: " + rectTwo.getX());
        System.out.println("Y Position of rectTwo: " + rectTwo.getY());

        rectTwo.setLocation(40,72);
        System.out.println("X Position of rectTwo: " + rectTwo.getX());
        System.out.println("Y Position of rectTwo: " + rectTwo.getY());

    }
}

결과

Width of rectOne: 100
Height of rectOne: 200
Area of rectOne: 20000.0
X Position of rectTwo: 23.0
Y Position of rectTwo: 94.0
X Position of rectTwo: 40.0
Y Position of rectTwo: 72.0

출처
https://docs.oracle.com/javase/tutorial/java/javaOO/objects.html

객체 만들기(Creating Objects)

클래스는 객체에 대한 설계도를 제공하기 때문에, 클래스로부터 객체를 만들 수 있다.

Point originOne = new Point(23, 94);
        Rectangle rectOne = new Rectangle(originOne, new Dimension(100,200));
        Rectangle rectTwo = new Rectangle(50, 100);

첫 줄은 Point 클래스 객체를 만들고, 두번째, 세번째 줄은 Rectangle 클래스의 객체를 만든다.

각 상태는 세 부분으로 구성되어있다.
1. 선언 : 볼드체 코드는 객체 타입과 다양한 이름을 연결하는 변수 선언이다.
2. 인스턴스화 : new 키워드는 객체를 만드는 자바 연산자다.

3. **초기화** : _new_ 연산자 다음엔 새 객체를 초기화하는 생성자를 호출한다. 

객체 참조를 위한 변수선언

변수를 선언하려면 다음과 같이 작성한다고 배웠다.

	type name;

이건 type이 type인 참조하는 name이라는 이름을 사용한다고 컴파일러에게 알린다. 원시타입 변수는 이 선언이 변수를 위한 메모리를 예약도 한다.

한 줄에 참조변수를 선언할 수도 있다.

	Point originOne;

만약 originOne을 이렇게 선언했으면,객체가 실제로 생성되고 할당이 될때까지 값이 결정되지 않는다. 간단히 말하자면 참조변수를 선언하는 것이 객체를 만드는건 아니다. 따라서 new 연산자를 이용해야 한다. 코드 내에서 originOne을 사용하기 전에 객체를 할당하지 않으면 컴파일 에러가 발생한다.
지금, 객체를 참조하지 않는 변수는 다음과 같이 설명할 수 있다. (변수명, originOne, 그리고 아무것도 가르키지 않는 참조!)


클래스 인스턴스화

new연산자는 새 객체를 위해 메모리를 할당하고 이 메모리의 참조를 반환해서 클래스를 인스턴스화한다. new 연산자는 객체 생성자도 호출한다.

"클래스 인스턴스화"는 "객체를 만들다" 라는 말과 같다.객체를 만들 때, 클래스의 인스턴스를 만드므로 클래스를 인스턴스화 한다.

new 연산자는 생성자 호출이 필요하다. 생성자 이름은 인스턴스화 할 클래스의 이름이다.
new 연산자는 자신이 만든 객체의 참조를 반환한다. 이 참조는 적절한 타입의 변수에 할당된다.

	Point originOne = new Point(23,94);

new 연산자에 의해 반환된 참조는 변수에 할당할 필요가 없다. 표현식에서 바로 사용할 수도 있다.

	int height = new Rectangle().height;

객체 초기화

Point 클래스는 다음과 같다.

	public class Point {
    	public int x = 0;
        public int y = 0;
        // constructor
        public Point(int a, int b) {
        	x = a;
            y = b;
        }
    }

이 클래스는 생성자 한개를 갖고 있다. 이 생성자는 클래스와 같은 이름을 사용하고 리턴 타입이 없기때문에 생성자로 인식할 수 있다. Point 클래스 생성자는 두개의 인자가 필요하다.

	Point originOne = new Point(23, 94);

이 명령문을 실행한 결과는 다음과 같이 표현할 수 있다.

다음은 생성자를 4개나 사용하는 Rectangle 클래스다.

public class Rectangle {
    public int width = 0;
    public int height = 0;
    public Point origin;

    // four constructors
    public Rectangle() {
        origin = new Point(0, 0);
    }
    public Rectangle(Point p) {
        origin = p;
    }
    public Rectangle(int w, int h) {
        origin = new Point(0, 0);
        width = w;
        height = h;
    }
    public Rectangle(Point p, int w, int h) {
        origin = p;
        width = w;
        height = h;
    }

    // a method for moving the rectangle
    public void move(int x, int y) {
        origin.x = x;
        origin.y = y;
    }

    // a method for computing the area of the rectangle
    public int getArea() {
        return width * height;
    }
}

각 생성자는 원시타입과 참조타입을 사용해서 사각형의 origin, width, height의 초기값을 제공한다.
만약 클래스가 여러개의 생성자를 갖고있으면, 각 생성자들은 반드시 다른 signatures를 가져야 한다. 자바 컴파일러는 인자의 갯수와 타입으로 생성자를 구분한다. 자바 컴파일러가 다음 코드를 만나면, int 타입 인자 두개가 있는 Point 인자가 필요한 Rectangle 클래스를 호출해야 함을 안다.

Rectangle rectOne = new Rectangle(originOne, 100, 200);

originoriginOne으로 초기화하는 Rectangle's 생성자중 하나를 호출한다.
또한, 생성자는 width를 100으로, height를 200으로 설정한다. 이제 Point 객체에 대해 두개의 참조가 있다. 객체는 여러개의 참조를 가질 수 있다.

다음 코드는 두개의 integer 인자(width, height)가 필요한 Rectangle 생성자를 호출한다. 만약, 생성자 내에 있는 코드를 검사하면 x,y가 0으로 초기화된 새로운 Point 객체를 볼 수 있다.

Rectangle rectTwo = new Rectangle(50, 100);

아래의 Rectangle 생성자는 인자를 사용하지 않으므로 no-argument constructor라고 한다.

Rectangle rect = new Rectangle();

모든 클래스는 적어도 한개의 생성자를 가진다. 만약 클래스가 아무것도 선언하지 않으면 자바 컴파일러는 자동으로 default constructor라고 부르는 no-argument constructor를 제공한다. 기본 생성자는 부모 클래스의 no-argument constructor 를 호출하거나, 부모 클래스가 없는 경우 객체 생성자를 호출한다. 만약 부모가 생성자를 갖고있지 않다면, 컴파일러는 프로그램을 거부한다.

출처
https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

profile
프로그래밍 학습에 왕도는 없다! 내가 컴퓨터를 닮아갈때까지!

0개의 댓글