생성자(Constructor)

클래스에 인스턴스를 생성하게 해주는 함수
생성자의 이름은 클래스의 이름과 같아야 한다.
해당 클래스의 인스턴스가 만들어질 때 클래스의 '멤버변수의 값을 초기화'한다.
반환타입없다.

→ 생성자: 인스턴스를 만들 때 멤버변수를 초기화한다.

기본생성자: Student() 괄호안에 비어있음, 값을 할당하지 않는다.

생성할 때 필수 값을 가지고 있어야 할 경우, 아래와 같이 정의한다.

public class Student{
	멤버변수;
    멤버함수;
	Student(매개변수){
    	멤버변수=매개변수;
    }
}

main에서 생성, 호출

	public static void main(String[] args) {

		Student st = new Student("h",123);
		
		st.infoPrint();
	}

결과값

만약 생성할 때 필수값을 가져야해서 개발자가 정의해주었을 때는
기본 생성자는 오류가 난다.

기본 생성자도 필요하다면 직접 넣어줘야 한다.

package ex02;

public class Student {

	int no;
	String name;
	int kor_score;
	int eng_score;
	int math_score;

	Student(int no, String name){
		this.no=no;
		this.name=name;
	}
	
	Student(){ // 기본생성자
		
	}
	
	void infoPrint() {
		System.out.println("이름: "+name);
		System.out.println("번호: "+no);
		System.out.println("국어점수: "+kor_score);
		System.out.println("영어점수: "+eng_score);
		System.out.println("수학점수: "+math_score);
		System.out.println("------------------");
	}
	
}

정리

함수의 시그니처

반환타입, 함수이름, 매개변수타입&갯수

	반환타입 함수이름(매개변수){
    
	}

함수의 '오버로딩'

  1. 함수의 이름이 같다.
  2. 함수의 시그니처가 하나라도 다르다.

this

클래스의 멤버변수와 함수의 매개변수의 이름을 같게 하려면(사용성↑)
this.멤버변수 = 매개변수로 사용한다.

	// 멤버변수
	int no;
	String name;
	char gender;
	
	// 모든 매개변수로 생성
	Student(int no, String name, char gender){
		this.no=i;
		this.name=s;
		this.gender=c;
	}

예제
1. 성별, 이름, 나이를 가진 Person클래스
2. 기본 생성자를 포함해서 모든 생성자를 만든다.

package ex0325;

public class Person {
	
	char gender;
	String name;
	int age;
	
	Person(){}
	Person(char gender){
		this.gender=gender;
	}
	Person(String name){
		this.name=name;
	}
	Person(int age){
		this.age=age;
	}
	Person(char gender, String name){
		this.gender=gender;
		this.name=name;
	}
	Person(String name, char gender){
		this.name=name;
		this.gender=gender;
	}
	Person(char gender, int age){
		this.gender=gender;
		this.age=age;
	}
	Person(int age, char gender){
		this.age=age;
		this.gender=gender;
	}
	Person(String name, int age){
		this.name=name;
		this.age=age;
	}
	Person(int age, String name){
		this.age=age;
		this.name=name;
	}
	Person(char gender, String name, int age){
		this.gender=gender;
		this.name=name;
		this.age=age;
	}
	Person(char gender, int age, String name){
		this.gender=gender;
		this.age=age;
		this.name=name;
	}
	Person(String name, int age, char gender){
		this.name=name;
		this.age=age;
		this.gender=gender;
	}
	Person(String name, char gender, int age){
		this.name=name;
		this.age=age;
		this.gender=gender;
	}
	Person(int age, char gender, String name){
		this.age=age;
		this.gender=gender;
		this.name=name;
	}
	Person(int age, String name, char gender){
		this.age=age;
		this.name=name;
		this.gender=gender;
	}
}

생성자 내에서 중복되는 경우를 고려해서 이미 생성한 생성자를 활용할 수 있다.
1번을 2번처럼 사용 가능하다.
1번

	Person(char gender, String name){
		this.gender=gender;
		this.name=name;
	}
	Person(char gender, String name, int age){
		this.gender=gender;
		this.name=name;
		this.age=age;
	}
    

2번

	Person(char gender, String name){
		this.gender=gender;
		this.name=name;
	}
	Person(char gender, String name, int age){
		this(gender, name);		// 위에서 생성한 생성자를 활용
		this.age=age;
	}

예제
학생의 번호를 바꿀 수 있는 멤버 함수

	void setNo(int no) {
		// 학생의 번호를 바꿀 수 있는 멤버함수
		this.no=no;
	}
	void setName(String name) {
		// 학생의 이름을 바꿀 수 있는 멤버함수
		this.name=name;
	}
	void setGender(char gender) {

현재 인스턴스가 가지고 있는 멤버변수 값을 리턴해주는 함수

	int getNo() {
		return this.no;
	}
	String getName() {
		return this.name;
	}
	char getGender() {
		return this.gender;
	}

Setter

멤버변수를 전달받은 값으로 할당시키는 함수

Getter

멤버변수의 값을 외부로 리턴하는 함수

변수표기법

  • 카멜표기법(int totalNumber): 첫글자는 소문자, 뒤에 나오는 변수이름은 대문자
  • 파스칼표기법(int TotalNumber): 모든 단어의 첫글자를 대문자
  • 헝가리안표기법(int intNumber): 접두어에 자료형을 알아볼 수 있게 표기
  • 스네이크표기법(int total_number): 단어 사이에 언더바로 구분

[예제] 도서정보프로그램
1. class 이름: Book
2. 멤버변수: 제목(title), 장르(String genre), 출판사(publisher), 가격(price), 작가(writer)
*필수데이터: title, writer, publisher
3. 멤버변수의 setter, getter 함수를 생성

BookTest.java

package ex0325;

public class BookTest {

	public static void main(String[] args) {
		
		Book b = new Book("오라클","길벗","조현영");
		System.out.println(b.title+", "+b.genre+", "+b.publisher+", "+b.price+"원, "+b.writer);
		
		b.setGenre("학습");
		b.setPrice(12000);
		
		System.out.println(b.title+", "+b.genre+", "+b.publisher+", "+b.price+"원, "+b.writer);
		
		System.out.println("제목: "+b.getTitle());
		System.out.println("장르: "+b.getGenre());
		System.out.println("출판사: "+b.getPublisher());
		System.out.println("가격: "+b.getPrice());
		System.out.println("작가: "+b.getWriter());
	}

}

Book.java //클래스

package ex0325;

public class Book {
	String title;
	String genre;
	String publisher;
	int price;
	String writer;
	
	Book(String title, String publisher, String writer){
		this.title=title;
		this.publisher=publisher;
		this.writer=writer;
	}
	
	void setTitle(String title) {
		this.title=title;
	}
	void setGenre(String genre) {
		this.genre=genre;
	}
	void setPublisher(String publisher) {
		this.publisher=publisher;
	}
	void setPrice(int price) {
		this.price=price;
	}
	void setWriter(String writer) {
		this.writer=writer;
	}
	
	String getTitle() {
		return title;
	}
	String getGenre() {
		return genre;
	}
	String getPublisher() {
		return publisher;
	}
	int getPrice() {
		return price;
	}
	String getWriter() {
		return writer;
	}
}

결과


[예제]
함수이름: bookInfoToString
책정보를 문자열로 반환한다.

	String bookInfoToString() {
		return "Title: " + getTitle() +
				" Genre: " + getGenre() +
				" Publisher: " + getPublisher() +
				" Price: " + getPrice() + "원" +
				" Writer: " + getWriter();
	}
	System.out.println(b.bookInfoToString());


이클립스 에디터가 getter랑 setter, toString() 등 생성할 수 있게 제공해준다.

@Override
	public String toString() {
		return "Book [title=" + title + ", genre=" + genre + ", publisher=" + publisher + ", price=" + price
				+ ", writer=" + writer + "]";
	}


[용어정리]

  • 클래스: 사용자가 정의하는 자료형, 인스턴스의 명세서, 붕어빵 틀

  • 멤버변수: field, 클래스에 정의된 변수

  • 멤버함수: method, 클래스에 정의된 함수

  • 인스턴스: 메모리에 클래스가 정의한대로 만들어진 상태 → 메모리맵으로 그릴 수 있음, 붕어빵

  • 생성자: 인스턴스를 만들어줌. new '클래스이름()';

  • 참조변수: 클래스를 통해 만들어진 인스턴스에 접근하기 위한 변수 → 주소를 저장할 변수

  • .: 참조변수를 통해 인스턴스의 field에 접근, ~의 라고 해석하면 좋음

  • this: 클래스 내 field, 멤버변수를 지정할 때 사용

  • 일반(원시) 자료형: int n=10;처럼 변수선언 후 10이라는 값을 넣을 수 있다.

  • 클래스: int[] arr; 는 배열을 가리킬 변수를 선언한 것이지만(참조변수) 배열은 생성되지 않아 new int[10];을 해주어야 함.


접근제한자

public

다른 패키지에 있는 클래스를 쓰기 위해서는
import 패키지.클래스명;
그리고 그 클래스의 필드에 접근하려면 필드 앞에 public을 설정해주어야 다른 패키지에서 사용할 수 있다.

private

private으로 정의해주면 같은 패키지여도 사용할 수 없음.

0개의 댓글