11강. 클래스와 객체1(3)

철새·2022년 2월 11일
0
  • Do it! 자바 프로그래밍 입문 온라인 강의를 수강하며 작성하였습니다.
  • Section 1. 자바의 핵심 - 객체지향 프로그래밍
  • 11강 "클래스와 객체1(3)"
  • class & instance > 클래스 생성 > 인스턴스와 힙(Heap) 메모리 > 용어 정리 > 생성자(constructor) > 생성자 오버로드 (constructor overload)

class & instance

  • 클래스(class)는 객체를 추상화한 개념이며, 그것을 구체적으로 표현한 것을 인스턴스(instance)라고 한다.
    ex) class : 개 / instance : 진돗개, 삽살개 등
  • 객체지향 프로그래밍은 객체를 정의하고 객체들을 class라는 코드로 표현한다.
    class를 구체적으로 작성하는 것을 instance화 한다고 한다.

클래스 생성

  • 클래스를 사용하기 위해서는 클래스를 생성해야 한다.
  • new 예약어를 이용하여 클래스를 생성한다.
  • 클래스형 변수이름 = new 생성자;
public class Student {
	// 멤버 변수를 정의
	int studentID;
	String studentName;
	int grade;
	String address;
	
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String name) {
		studentName = name;
	}
	
	// 메서드 정의
	public void showStudentInfo() {
		System.out.println("학번 : " + studentID);
		System.out.println("이름 : " + studentName);
		System.out.println("학년 : " + grade);
		System.out.println("주소 : " + address);
	}
	
	public static void main(String[] args) {
		Student studentLee = new Student();	//클래스 생성
		//생성된 클래스의 멤버 변수를 초기화
		studentLee.studentID = 20220210;
		studentLee.studentName = "이순신";
		studentLee.grade = 2;
		studentLee.address = "서울시 서초구 서초동";
		//클래스의 메서드 호출
		studentLee.showStudentInfo();
	}
}

지난 강의에서 작성했던 코드이다. Student라는 클래스를 호출하기 위한
Student studentLee = new Student(); 코드를 분석해보면 다음과 같다.

  • 맨 앞의 Student는 객체형(클래스형)이며 참조형 데이터타입이라고 한다.
  • 두 번째 studentLee는 참조 변수라고 한다.
  • Student()는 기본생성자라고 한다.

인스턴스와 힙(Heap) 메모리

  • 하나의 클래스 코드로부터 여러 개의 인스턴스를 생성할 수 있다.
  • 지역변수는 스택메모리에 생성되며, 인스턴스는 힙(Heap) 메모리에 생성된다.
  • 각각의 인스턴스는 다른 메모리에 다른 값을 가진다.
  • 힙 메모리는 동적으로 생성되는 메모리로, 필요할 때 allocation(할당) 받는다.
    heap 메모리 설명
  1. 예시코드의 경우에 studentID, studentName, grade, address 변수들이 Student의 instance로서 힙 메모리에 할당된다.
  2. studentLee 라는 변수에 new Student()로 클래스를 생성하면, studentLee 변수는 stack 메모리에 생성되어 heap 메모리에 저장된 instance의 주소를 가리키게 된다.
  3. studentSong 이라는 새로운 변수에 new Student()로 클래스를 생성하면, studentSong과 studentLee의 인스턴스는 각각 다른 메로리 공간을 갖는다.
    즉, studentSong과 studentLee는 서로 다른 주소를 가리키게 된다.
  4. heap 메모리는 추후 배우게 될 가비지 컬렉션을 통해 수거된다.

용어 정리

용어설명
객체객체 지향 프로그램의 대상, 생성된 인스턴스
클래스객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스클래스가 메모리에 생성된 상태
멤버 변수클래스의 속성, 특성
메서드멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수메모리에 생성된 인스턴스를 가리키는 변수
참조 값생성된 인스턴스의 메모리 주소 값

생성자(constructor)

  • 인스턴스 생성 시 new 키워드와 함께 사용했던 생성자
    Student studentLee = new Student() 에서 Student()가 생성자다.
  • 생성자는 객체를 처음 생성하면서 해야될 일들을 구현하는 것이다.
  • 클래스의 생성자가 하나도 없는 경우 자바 컴파일러가 코드를 컴파일하기 전에 default 생성자를 넣어준다. (매개변수도 없고, 실행 코드도 없는 생성자)
  • 생성자가 하나라도 있으면 default 생성자는 자동으로 생기지 않기 때문에 필요하다면 작성해주어야 한다.
// 생성자 기본 문법
<modifiers> <class_name> ([<argument_list>]){
	[<statements>]
}
  • 생성자는 인스턴스를 초기화할 때의 명령어 집합이다.
  • 생성자의 이름은 그 클래스의 이름과 같다.
  • 생성자는 메소드가 아니다. 때문에 상속되지 않으며, 리턴 값은 없다.

Student class에 작성해보겠다.

public class Student {
	// 멤버 변수를 정의
	int studentID;
	String studentName;
	int grade;
	String address;
	
    // 생성자(constructor) 정의
	public Student(int id, String name) {
		studentID = id;
		studentName = name;
	}
	
	public static void main(String[] args) {
		Student studentLee = new Student();	//클래스 생성
		//생성된 클래스의 멤버 변수를 초기화
		studentLee.studentID = 20220210;
		studentLee.studentName = "이순신";
		studentLee.grade = 2;
		studentLee.address = "서울시 서초구 서초동";
		//클래스의 메서드 호출
		studentLee.showStudentInfo();
	}
}

위와 같이 class 내부에 생성자를 정의할 수 있지만 main()에서 에러가 난다.
그 이유는 생성자를 정의해주었기 때문에 default 생성자를 자동으로 생성해주지 않기 때문이다.
에러를 수정하기 위한 방법은 두 가지가 있다.
1. new Student() 부분을 new Student(20220210, "이순신") 처럼 바꿔준다.
2. class 내부에 default 생성자를 직접 만들어준다. ex) public Student( ) { }

생성자 오버로드 (constructor overload)

  • 필요에 의해 생성자를 추가하는 경우 여러 개의 생성자가 하나의 클래스에 있을 수 있다.
    (다른 매개변수, 다른 구현부를 가지고 하나의 클래스에 존재할 수 있다.)
    public class Person {
    	String name;
    	float height;
    	float weight;
    	
       //default 생성자
    	public Person() {}
    	//이름을 매개변수로 입력받는 생성자
    	public Person(String pname) {
    		name = pname;
    	}
    	//이름, 키, 몸무게를 매개변수로 입력받는 생성자
    	public Person(String pname, float pheight, float pweight) {
    		name = pname;
    		height = pheight;
    		weight = pweight;
    	}
    }
    위와 같이 생성자를 만들어두면 Person클래스를 호출할 때는
    new Person()
    new Person("홍길동")
    new Person("홍길동", 180, 73)
    세 가지 방식으로 호출할 수 있게 되는 것이다.
profile
효율성을 추구하며 세상을 떠도는 철새입니다.

0개의 댓글

관련 채용 정보