Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

객체와 참조 본문

Java

객체와 참조

빌드이너프 2023. 2. 6. 17:56
실 세계의 한 대상을 모델한 클래스를 이용하려면 객체를 생성해야됨
필요에 따라 한 클래스로부터 여러 개의 객체들을 생성할 수 있음
이 객체들을 서로 구별할 수 있어야 하고 이를 위해 참조형 변수를 사용함
참조형 변수는 가리키는 객치의 참조(reference)를 저장함
참조는 가리키는 개체의 주소

 

객체 생성하는 과정

  • 자바에서 변수는 기본형인 경우: 값 자체를 저장, 참조형인 경우: 가리키는 객체의 참조 값(주소)를 저장함
  • 기본형 변수들 같이 참조형 변수도 사용하기 전에 선언해야 함
  • 한 객체를 정의하기 위해 사용되는 클래스가 그 객체의 데이터형이 됨

 

int number;
String name;
  • 첫 번째 선언문은 정수 값을 저장하는 변수를 만듬
  • 두 번째 선언문은 한 String 객체를 가리키는 참조 값을 저장하는 String 형 변수를 만든다
  • 참조형 변수는 객체 자체를 저장하지 않고 객체의 주소를 저장함
  • 정의된 두 변수들은 처음에 어떤 값을 저장하지 않는다
  • 참조형 변수는 null로 초기화 될 수 있음(null: 자바의 예약어)
  • 한 참조형 변수가 null 값을 가지는 것은 그 변수가 어떤 객체도 가리키지 않는다는 것을 의미함
  • 모든 변수는 항상 사용하기 전에 초기화되어 있는지를 확실히 하는 것이 중요함
  • 참조형 변수의 경우 사용하기 전에 유효한 객체를 가리키고 있는지 확인해야한다
    • 대부분의 상황에서 변수를 초기화하기 전에 사용하려고 시도하면 컴파일러는 오류를 만들어냄
  • 위 코드에서 String 형 참조 변수인 name 을 선언했지만, 실제로 어떤 String 객체도 존재하지 않는다
  • 객체를 생성하는 것은 실례 만들기(instantiation)라고 부름
  • 한 객체는 특정 클래스의 한 실례(instance)라고 부름
  • 객체를 생성하기 위해 new 연산자를 사용할 수 있다
    • new 연산자는 새 객체의 주소를 반환
number = 75
name = new String("홍길동");
  • 두 배정문들은 위에서 연산한 두 변수들에게 값을 줌
  • new 연산자가 객체를 생성한 후 생성자 메소드가 그 객체의 변수(들) 값을 초기화하기 위해 호출됨
  • 생성자 메소드: 클래스와 같은 이름을 가지는 특별한 메소드
  • 참조형 변수는 객체의 주소를 저장하기 때문에 객체가 저장되어 있는 메모리 위치에 대한 지시자(pointer)로 여겨질 수 있다
  • 숫자 형태의 주소를 보여줄 수 있지만 실제 주소 값을 부적절함
    • 위 문들이 실행될때마다 실제 주소 값이 다르기 때문
    • 중요한 것은 참조형 변수는 특정 개체를 가리킨다는 사실

마침표(.) 연산자

  • 마침표 연산자는 참조 변수 바로 다음에 나옴

count = name.length();

 

  • name 변수가 가리키는 String 객체의 문자열 길이를 알기 위해 String 클래스 내에 정의된 length 메소드를 호출함
    • length 메소드는 매개 변수가 없음
    • length 메소드는 한 문자열 내에 있는 문자들의 수를 계산하여 반환함

Account 클래스

public Account(String name, int number, int amount)
{
    setOwnerName(name);
    setAccountNumber(number);
    setBalace(amount);
}
  • Account 클래스이 객체를 생성할 때 예금주 이름, 계좌번호, 잔고의 값을 각각 매개 변수의 값으로 초기화하는 생성자 메소드를 추가함
  • 생성자 메소드의 이름은 클래스의 이름과 같음
  • 각 객체 변수의 값을 주어진 매개 변수의 값으로 초기화하기 위해서 Account 클래스 내의 적절한 변경자 메소드를 이용할 수 있음
    • 즉, 예금주 이름을 주어진 매개 변수의 값으로 초기화하기 위해 setOwnerName 메소드를 그 매개 변수의 값을 가지고 호출함

 

Account 객체를 가리킬 수 있는 변수 선언

Account acct;
  • Account 클래스로부터 생성되는 Account 객체를 가리킬 수 있는 acct 라는 참조 변수 선언함
  • 그러나 Account 객체는 생성하지 않음
  • -> acct는 어떤 Account 객체도 가리키지 않는다

 

참조변수가 객체를 가리키게 하기 위해 객체를 생성한 후 그 객체를 가리키게 함

acct = new Account();
  • 배정문의 오른쪽에 있는 연산식 new 연산자 다음 Account 클래스의 기본 생성자 메소드 호출문 Account()로 구성되어 있음
  • new Account() 연산식은 하나의 Account 객체를 생성하고 그 객체의 주소를 반환함
  • 이 경우 기본 생성자 메소드가 호출되어 객체 변수들은 기본 값들을 가짐
    • 즉, 정수형 변수는 0이라는 기본값을, 참조형 변수는 null 값 가짐
  • 따라서 위 배정문은 acct 변수가 새로 생성된 Account 객체의 주소를 저장함
  • 즉, acct는 새로 생성된 Account 객체를 가리킴
  • 생성된 객체는 대응하는 클래스에서 정의된 모든 객체 변수들의 고유한 사본(copy)를 가짐
  • 해당 클래스에서 정의된 모든 메소드는 모든 객체들 사이에 공유됨