본문 바로가기
👨‍🏫Study/JAVA

[JAVA] 06 - 1 객체 지향 프로그래밍, 06 - 2 필드, 06 - 3 생성자

by 코푸는 개발자 2021. 8. 5.
728x90

단어정리

  • 클래스 : 객체를 만들기 위한 설계도(관례적으로 첫 글자를 대문자로 사용하고, 여러 단어의 경우 단어의 앞글자마다 대문자 사용)
  • 객체 : 클래스로부터 생성되며 new 클래스로 생성
  • new 연산자 : 객체 생성 연산자이며 생성자 호출하고 객체 생성 번지를 리턴
  • 클래스 변수 : 클래스로 선언한 변수이며 해당 클래스의 객체 번지 저장
  • 인스턴스 : 어떤 클래스를 기준으로 만들어진 객체 -> 해당 클래스의 인스턴스
  • 클래스 멤버 : 클래스에 선언되는 멤버로 필드, 생성자, 메소드가 있음

객체란?

물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별이 가능한 것

 

메소드 - 객체들 사이의 상호작용 수단

* 메소드 호출은 도트(.)를 객체에 붙여서 가져오면 됩니다.

 

객체 간의 관계
  • 집합 관계 : 부품과 완성품의 관계
  • 사용 관계 : 객체 간의 상호작용
  • 상속 관계 : 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성
  • 객체 지향 프로그래밍 : 집합/사용 관계에 있는 객체를 하나씩 설계한 후 조립하여 프로그램 개발

 

객체와 클래스
  • 자바의 설계도
  • 인스턴스(instance = 객체) : 클래스로부터 만들어진 객체
  • 객체 지향 프로그래밍 단계(클래스 설계 -> 설계된 클래스로 사용할 객체 생성 -> 객체 이용)

 

클래스 선언
//클래스 이름.java로 소스파일 생성
public class 클래스이름{

}

 

클래스로부터 객체 생성
  • new 클래스();
  • new 연산자로 메모리 힙 영역에 객체 생성
  • 객체 생성 후 객체 번지가 리턴된다. 클래스 변수에 저장하여 변수를 통해 객체 사용 가능
//방법 1
클래스 변수;
변수 = new 클래스();

//방법 2
클래스 변수 = new 클래스();

 

*클래스 변수는 스택 영역에 생성되고 new에 의해서 생성된 객체는 힙 영역에 생성된다. 힙 영역에 생성된 객체의 번지가 클래스 변수의 값으로 대입되어 참조하게 된다.

 

클래스의 사용방식
  • 라이브러리(API : Application Program Interface) 클래스 : 객체 생성 및 메소드 제공 역할
  • 실행 클래스 : main 메소드 제공 역할

 

클래스 구성

 

 

단어정리

  • 필드 선언 : 클래스 중괄호 블록 어디서든 선언하나 생성자나 메소드 내부에서는 사용 불가
  • 필드 사용 : 클래스 내부의 생성자와 메소드에서 바로 사용 가능, 클래스 외부에서 사용할 경우 반드시 객체 생성하고 참조 변수 통해 사용

 

필드
  • 객체의 고유 데이터
  • 객체가 가져야 할 부품
  • 객체의 현재 상태 데이터 등을 저장

 

선언
  • 클래스 중괄호 블록 어디서든 존재 가능
  • 생성자와 메소드 중괄호 블록 내부에는 선언 불가
  • 변수와 선언 형태 유사하나 변수가 아님을 주의
class 클래스명 {
  타입 필드명 = 초기값
  
  String company = "현대자동차";
  String model = "제네시스";
  int maxSpeed;
}

위 코드에서 확인할 수 있듯이 초기값은 주어질 수도, 생략할 수도 있다. 초기값이 주어지지 않으면 객체 생성 시 자동으로 기본 초기값이 설정됩니다.

 

필드 사용
  • 필드값 읽고 변경하는 작업
  • 클래스 내부 생성자 및 메소드에서 사용하는 경우 : 필드 이름으로 읽고 변경
  • 클래스 외부에서 사용하는 경우 : 클래스로부터 객체 생성한 뒤 필드 사용
class Car{
  //  필드
  int speed; 

  // 생성자
  Car(){ 
    speed = 0; // 내부사용 변경
  }

  // 메소드
  void method(...){
    speed=10; // 값 변경
  }
}

class Person(){

  // 메소드
  void method(){
    // Car 객체 생성
    Car myCar = new Car();
    // 필드 사용
    myCar.speed = 60;
  }
}

 

 

 

단어정리

  • 기본 생성자 : 클래스 선언 시 컴파일러에 의해 자동으로 추가되는 생성자
  • 생성자 선언 : 생성자를 명시적으로 선언 가능, 생성자를 선언하면 기본 생성자는 생성되지 않음
  • 매개 변수 : 생성자 호출 시 값을 전달받기 위해 선언되는 변수
  • 객체 초기화 : 생성자 내부에서 필드값 초기화하거나 메소드 호출해서 사용 준비를 하는 것
  • 오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언
  • this() : 객체 자신의 또다른 생성자를 호출할 때 사용

 

기본 생성자

클래스 내부에 생성자 선언을 생략할 경우 바이트 코드에 자동 추가된다. 따라서 클래스에 생성자를 선언하지 않아도 new 생성자()로 객체 생성이 가능하다.

클래스명() {} 

클래스 선언할 때 만약 public class 클래스명 {} 으로 public이 붙어있다면
생성자에도 아래와 같이 public이 자동으로 추가된다.
public 클래스() {}

 

선언

클래스에 생성자가 명시적으로 선언되었을 경우 반드시 선언된 생성자를 호출하여 객체를 생성해야 한다. (매개변수도 만족하도록)

클래스명(매개변수선언){ // 매개변수선언은 생략할 수도 여러 개를 선언할 수도 있음
    // 객체의 초기화 코드
}

 

생성자의 필드 초기화
public class Korean{
    // 필드
    String nation = "Korea";
    String name;
    int age;

    // 생성자
    public Korean(String n, int a){
        name = n;
        age = a;
    }
}

실행문에서(main)
Korean k1 = new Korean("홍길동",23);
Korean k2 = new Korean("장보고",25);

nation은 고정값으로 굳이 인자도 받지 않아도 되므로 필드값으로 주었고 이름과 나이는 사람마다 다르므로 생성자의 인자로 받아 대입시켰다. 이런식으로 활용하는 것이다.
메인에서 위와 같이 선언하게 되면 스택에는 k1,k2가 생성되고 힙에는 객체 2개가 생성된다. 이 객체의 주소를 k1,k2가 받으면서 참조하게 된다.

 

 

필드 초기화 주의점
  • 생성자의 인자로 사용하는 매개 변수 이름은 필드 이름과 유사하거나 동일한 것으로 사용을 권장한다.
  • 필드와 매개 변수 이름이 완전히 동일한 경우 this.필드명 으로 표현한다.
public class Korean{
    // 필드
    String nation = "Korea";
    String name;
    int age;

    // 생성자
    public Korean(String name, int age){
        name = name;
        age = age;
    }
}

public class Korean{
    // 필드
    String nation = "Korea";
    String name;
    int age;

    // 생성자
    public Korean(String name, int age){
        this.name = name;
        this.age = age;
    }
}

위 코드에서 보면 생성자의 인자와 클래스 필드의 변수명이 같다. 이 경우에는 클래스의 필드보다 매개인자가 우선적으로 사용된다. 따라서 인자 name에 인자 name을 넣는 적절하지 못한 동작이 수행된다. 따라서 이를 방지하기 위해 this. 을 사용한다. this.은 내가 가지고 있는 이라고 해석하면 된다. 따라서 this.name은 내가 가지고 있는 필드 name을 의미하게 된다.

 

생성자 오버로딩
  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 의미
  • 외부에서 제공되는 다양한 데이터 사용하여 객체 초기화하려면 생성자 역시 다양화해야하기 때문에 사용한다.
public class Car{
    Car(){..}
    Car(String model){...}
    Car(String model, String color){...}
    Car(String model, String color, int maxspeed){...}

    Car(String mo,int x) // 오버로딩이 아님
    Car(String de,int y) // 오버로딩이 아님
    //같은 메소드를 사용한 것임
}

매개 변수의 타입, 개수, 선언된 순서가 같은 경우, 매개 변수 이름만 바꾸는 것은 오버로딩이 아니다.

다른 생성자 호출: this()
  • 생성자에서 다른 생성자 호출
  • 필드 초기화 내용을 한 생성자에만 집중 작성하고 나머지 생성자는 초기화 내용을 가진 생성자로 호출한다.(생성자 오버로딩 증가 시 중복 코드 발생 문제를 해결)
  • 생성자 첫 줄에서만 허용한다. 만약 첫 줄에 출력을 찍고 다음에 this호출시 에러가 뜬다.
// 생성자 오버로딩으로 인한 중복 코드 발생
public class Car{
    // 필드 있다고 가정
    
    Car(String model){
        this.model = model;
        this.color = "은색";
        this.maxspeed = 250; 
    }

    Car(String model, String color){
        this.model = model;
        this.color = color;
        this.maxspeed = 250; 
    }

    Car(String model, String color, int maxspeed){
        this.model = model;
        this.color = color;
        this.maxspeed = speed; 
    }
}

// 다른 생성자 호출로 해결
public class Car{
    // 필드 있다고 가정
    
    Car(String model){
        this(model,"은색",250); // 해당 인자를 소화할 수 있는 생성자를 호출, 즉 3번째 호출
    }

    Car(String model, String color){ // 해당 인자를 소화할 수 있는 생성자를 호출, 즉 3번째 호출
        this(model,color,250)
    }

    Car(String model, String color, int maxspeed){
        this.model = model;
        this.color = color;
        this.maxspeed = speed; 
    }
}

 

 

728x90

'👨‍🏫Study > JAVA' 카테고리의 다른 글

[JAVA] 06 - 5 인스턴스 멤버와 정적 멤버  (0) 2021.08.06
[JAVA] 06 - 4 메소드  (0) 2021.08.06
[JAVA] 05 참조 타입  (0) 2021.08.04
[JAVA] 04 조건문과 반복문  (0) 2021.08.03
[JAVA] 03 연산자  (0) 2021.08.03

댓글