[JAVA] 객체지향(6)

위 글은 김성박선생님의 강의를 정리한 글입니다. 자세한 내용은https://www.facebook.com/groups/codingeverybody/posts/7530033737037097/ 을 참고해주세요.


위를 실행 시키면 다음과 같은 결과를 얻는다.

왜 이런 결과가 나올까? 알아보도록 하자

1. println메소드에 대해 알아보자.


위 그림은 println메소드에 관한 설명이다. Object타입의 x를 String.valueOf를 이용해 변수 String에 담는다.

2. valueOf에 대해 알아보자


코드분석: obj == null 이면 "null"을 반환하고, obj != null 이면 obj.toString()을 반환한다.

System.out.println(o1.toString()); == System.out.println(o1);

위의 두 코드는 같은 뜻이다.

하지만, 위의 결과는 쓸모 없는 일이다.

우리가 원하는 c1객체를 문자로 출력하기 위해서는 Object객체의 toString 메소드를 오버라이딩 해야한다는 것이다.

Object가 오버라이딩하라고 제공하는 메소드

  • toString()
  • eqauls() & hashCode()

생성자

  • 인스턴스를 생성할 때 사용한다.
  • 어떤 값을 가지고 인스턴스가 만들어지게 하고 싶다면 생성자를 사용한다.
  • 클래스 작성시 생성자를 하나도 만들지 않았다면, 자동으로 기본 생성자가 생성된다.
  • 기본생성자는 매개변수를 하나도 받지 않는 생성자를 말한다.

생성자는 메소드와 비슷하지만 return 타입이 없고, 클래스 이름과 같아야 한다.
매개변수가 0개인 생성자를 기본생성자라고 한다.
생성자가 하나도 없으면 아무일도 안하는 기본생성자가 자동으로 만들어진다.


위의 코드에서
c1.printName(); 은 c1객체에서 아무 값도 받지 않았으니 default값인 null이 name에 저장된다.

c2.printName(); 은 c2객체에서 urstory라는 값을 받았으니 urstory가 저장된다.

또 다른 예시


오류가 나는 이유는 무엇일까?

그 이유는 User 클래스에서 User생성자를 만들었는데, 생성자를 만들면 기본생성자는 생성이 되지 않기 때문이다.

UserExam클래스에서 User객체에 name과 email을 넣어 주어야 한다.

이제, user의 이름과 이메일을 불러와 보도록 하자.

위와같이 user객체를 통해 name을 얻으려 했는데 오류가 발생한다. 그 이유는 User클래스에서 email,password,name을 private로 설정했기 때문이다.

위와 같이 get메소드를 만들어주고,
메소드를 이용해 name과 email을 불러 올 수 있다.

위의 메소드처럼 name과 email을 불러올 수 있지만, 변경할 수 없는 것을 불변객체라고 한다.

Object 객체의 toString() 이용한 방법

User클래스에 아래와 같이 toString메소드를 오버라이딩해보자.


그리고, UserExam에서 생성자 user를 호출하면,
toString메소드를 통해 email과 name의 값을 얻을 수 있다.

여기서 개인정보에 민감한 내용(password)은 toString메소드에 넣지 않는 것이 중요하다.

User클래스


위의 코드에서 User생성자를 보면 중복되는 부분이 많이 보인다.
중복된 부분을 줄여보자.

this생성자를 이용해, 코드의 중복을 해결 할 수 있다.
단 this생성자는 코드의 맨 앞줄에 위치해야만 한다.

생성자 오버로딩

  • 생성자는 매개변수의 개수가 다르거나, 타입이 다르다면 여러개를 가질 수 있다.

자신의 생성자를 호출 할 때는 this()를 사용한다.

  • this는 인스턴스 자기자신을 참조할때 사용하는 키워드이다.
  • this() 생성자는 자기 자신의 생성자를 말한다.
  • this() 생성자는 생성자 안에서만 사용가능하다.
  • this() 생성자는 생성자 안에서 super()생성자를 호출하는 코드 다음이나, 첫째 줄에 위치해야 한다.

super() 예시




위의 그림에서 c1생성자와 b1 생성자를 만들고 Car2Exam을 실행시키면 "Car2()생성자 호출"이 2번 호출이 된다.

Bus2클래스에서 생성자는 만들지 않았지만, 기본적으로 super(); 가 자동으로 생성되기 때문이다.

부모의 생성자를 추가하는 코드가 자동으로 생성되기 때문이다.

부모의 생성자를 호출 할 때는 super()를 사용한다.

  • super는 인스턴스 부모를 참조할 때 사용하는 키워드이다.
  • super() 생성자는 부모 생성자를 의미한다.
  • super() 생성자는 생성자 안에서만 사용가능하다.
  • super() 생성자는 생성자 안에서 첫번째 줄에만 올 수 있다.
  • 생성자는 무조건 super() 생성자를 호출해야 한다. 사용자가 super()생성자를 호출하는 코드를 작성하지 않았다면 자동으로 부모의 기본 생성자가 호출된다.
  • 부모 클래스가 기본 생성자를 가지고 있지 않다면, 사용자는 반드시 직접 super()생성자를 호출하는 코드를 작성해야한다.

불변(Immutable)객체

  • String 클래스는 불변 객체이다.
    String이 갖고 있는 모든 메소드는 String내부의 값을 변화시키지 않는다.