산유리
40
2020-10-26 12:15:46
4
259

Java 클래스와 멤버 변수, 생성자에 대해 궁금한 것이 있습니다.


안녕하세요 자바를 배운지 얼마되지 않은 학생입니다.

클래스와 멤버 변수, 생성자에 대해서 의문이 생겨 질문글을 올리게 되었습니다.


public class Point {
    int xPos;
    int yPos;

    public Point(int x, int y) {
        this.xPos = x;
        this.yPos = y;
    }

    public void showPointInfo() {
        System.out.println("[" + xPos + ", " yPos + "]");
    }
}

위의 Point라는 클래스를 미리 만들어두고


public class TestCircle {
    private Point point;
    private int r;

    public TestCircle(int x, int y, int r) {
        this.point = new Point(x, y);
        this.r = r;
    }

    public showCircleInfo() {
        System.out.println(this.r);
        this.point.showPointInfo();
    }
}


main 메소드가 존재하는 클래스 파일에서는 TestCircle 클래스 생성자를 통해 객체를 만들어내고

그 객체의 showCircleInfo라는 메소드를 이용해서 Point에서 받은 x좌표와 y좌표도 함께 출력하려하는

코드인데 공부할 당시에는 의문을 가지지 못하다가 막상 혼자 풀려고 하니 의문이 생기는데


여기서 궁금한 부분은

1. 제가 공부하기는 멤버 변수는 캡슐화를 위해서 보통 그 클래스의 특징적인 부분(예를 들면 사람을 클래스로 만든다면 int head = 1;, int arms = 2;와 같이 선언을 하는데 여기서는 어떻게 다른 클래스(Point)가 선언이 되어지는지


2. 그리고 TestCircle 생성자에서 처럼 저렇게 선언하는게 아닌 Point point = new Point(x, y);와 같이

일반적으로 객체를 생성할 때 처럼 사용을 하는 것과 어떤 점이 다른지가 궁금합니다.

Point point = new Point(x, y);로 선언해서 값을 받으려하니 showCircleInfo() 메소드에서는 point가

없는 것 처럼 취급이 되더라구요



0
  • 답변 4

  • 니르바나
    2k
    2020-10-26 12:29:28 작성 2020-10-26 12:30:56 수정됨

    1.

        public TestCircle(int x, int y, int r) {
            this.point = new Point(x, y);
            this.r = r;
        }
    

    해당 생성자에서 new Point로 객체 생성이 된거에요.

    Point 클래스 import해서 사용하거나 같은 파일 내에서 호출하는 함수보다 먼저 선언해주면되죠.


    2. TestCircle 클래스의 객체가 생성 되는 시점에 Point, Circle에 필요한 정보들을 파라미터로 넘겨주는거에요.. 함수에서는 정보를 보여주는 함수일 뿐이지 point정보를 할당할 수 없습니다.

    원하면 다른 setCircleInof(Point xy)라는 함수를 하나 선언해서 멤버변수의 값을 바꿔줘야겠죠.


    멤버변수, 클래스, 객체간의 관계에 대한 이해가 좀 더 필요한 것 같아요.

    클래스 , 객체, 멤버변수 쪽 내용을 여러번 더 읽어보세요~

    그쪽 내용이 제대로 정리가 안되면 객체지향 언어는 허우적 될 가능성이 높습니다.

  • 퀘이사123
    552
    2020-10-26 13:20:25 작성 2020-10-26 13:36:10 수정됨

    1. 객체의 캡슐화는 간단히 말해서 외부에서 마음대로 접근못하게 감싸는것을 말합니다.

    point 클래스를 예로 들면 point 클래스의 멤버변수인 xPos와 yPos를 point라는 클래스로 감싸고 

    이 두 멤버변수에 private를 선언하여, 외부에서 이 변수에 마음대로 값을 수정하지못하게하고,

    필요한 메서드들을 public으로 만들어 내가 만들어놓은 메서드를 통해서만 멤버변수를 조작할수있게 하는것입니다. 

    질문하신게 어떻게 멤버변수로 다른클래스가 선언되냐 물으시는것같은데, 이건 캡슐화랑 관계없는것 같구요, 멤버변수로는 기본타입이든 레퍼런스타입이든 전부 선언할 수 있습니다.


    사람에게 팔다리도 있지만, 모자도 쓸 수 있고, 옷도 입을 수 있는거랑 비슷한거죠.

    사람이라는 객체에 멤버변수로 팔,다리,모자,옷 이런게 다 가능하다는거죠.



    2.Point point = new Point(x, y); 과 this.point = new Point(x, y); 의 차이는

    전자는 새로운 point객체를 하나 만드는것이고 후자는 TestCircle 에 선언되어 있는 point객체에 값을 초기

    화시켜준다는것이죠.

    Point point = new Point(x, y);로 선언해서 값을 받으려하니 showCircleInfo() 메소드에서는 point가

    없는 것 처럼 취급이 되더라구요


    라고 하시는데, 새로 선언한 point와 TestCircle 에 있는 point는 완전 다른 객체입니다.

    showCircleInfo() 에서는 TestCircle 에 있는 point를 통해서 메서드를 실행하려고 하는데

    point는 지금 선언만 되었다 뿐이지 어느곳에서도 초기화를 해주지 않으니까, 당연히 값이 없죠.


    하지만 this.point = new Point(x, y); 이렇게 한다면 TestCircle 선언되어 있는 point객체에 값을 초기화 시켜준게되고, showCircleInfo()이 값도 정상적으로 잘찍히겟죠


    더 쉬운 예로


    내가 point라는 이름의 주머니를 하나 가지고 있다고 한다면

    전자는 내가 가지고 있는 주머니에 구슬을 넣는것이고, 후자는 새로운 point주머니를 만들어서

    그 주머니에 구슬을 넣는것입니다.

    그러면 같은 point라는 이름의 주머니라도 전자는 내 주머니에 구슬이 있고, 후자는 없겠죠?

  • 성능최적화계획
    525
    2020-10-26 13:22:36

    1. 질의 내용을 잘 이해 못하겠네요ㅠㅠ

    생성자는 초기값(초기화) 지정이라고 보시면 될거 같아요. 

        public TestCircle(int x, int y, int r) {
            this.point = new Point(x, y);
            this.r = r;
        }

    TestCircle생성자에서 r의 값도 초기값 지정하고 point인스턴스도 초기값 지정해 줍니다.


    2. 

        public TestCircle(int x, int y, int r) {
            Point point = new Point(x, y);
            //this.point    = new Point(x, y);
            this.r = r;
        }

    Point point 의 생명주기는 생성자 처리가 완료되면 소멸됩니다.

    showCircleInfo에서 당연히 this.point는 null 이기에 오류납니다.


  • 산유리
    40
    2020-10-27 23:30:12

    다들 설명 열심히 해주셔서 감사합니다 :-)

    그래도 이해를 잘 못하는걸 보니 클래스, 객체 부분을 다시 차근차근 공부를 해봐야 할 것 같습니다.

    모두 좋은 한 주 보내시기 바랍니다 ^^

  • 로그인을 하시면 답변을 등록할 수 있습니다.