22. 04. 21 - 생성자(Constructor), 오버로딩(overloading)
생성자 – Constructor
- 객체를 생성함
- 컴퓨터가 자동으로 생성해줌 ( 디폴트 생성자는 )
- public MenuHamburger(){ }
- 접근 제한자 클래스 이름( ) { }
> 생성자를 호출해서 객체를 생성한 것이었다.!
> 모든 클래스 타입에는 생성자를 가지고 있다. ( 필요하다 )
> ( 클래스 타입을 만드는 이유가 객체를 만드려고 존재하는 것이기 때문에 )
생성자 호출
- 메서드 호출과 비슷하다고 이해하면 된다
- 생성자를 호출하게 되면, 생성자 찾아가서 { } 찾아가서 수행하고 다시 돌아온다.
- 생성자는 리턴 타입이 없다. 왜 그럴까?
- 객체 생성만 해주는 것이 역할이라서 == 객체 초기화만 담당하므로
- 생성자는 클래스 네임이랑 똑같아야 한다.
- 접근 제한자는 생략 가능
+@ tip
> 이 클래스로 객체를 만들지 않았으면 할 경우에
> private 으로 생성자 만들어 줄 수 있는데 이런 경우는 흔치 않다.
> java에서는 객체를 없애는 소멸자 개념은 없다. GC가 해결해준다.
오버 로딩
- 오버 로딩 : 똑같은 이름으로 여러 개 만드는 것
- 크게 2가지가 있다.
- 1. 메소드 오버 로딩 ( 매개변수를 다르게 하여 메소드를 작성 )
- 2. 생성자 오버 로딩 ( 매개변수를 다르게 하여 생성자를 작성 )
메소드 오버 로딩
- 매개변수를 다르게 하여 메소드를 작성
1. 기본 세팅
- com.kh.overload.main 패키지 – Main 클래스
- com.kh.overload.test 패키지 – Test 클래스
2. Test 클래스에서 - 메소드 똑같이 만들어보기 && 매개변수 다르게 만들어보기
- 메소드 명 똑같은데 에러 안 나고 만들어졌다.
- 매개변수가 다르면 완전히 다른 메소드라고 판단 –> 만들어진다.
- 메소드 오버 로딩 기능이 없다면 다른 상황마다 모두 새롭게 메소드를 만들어야 했다.
- 누구누구에게 hi 하기 위해서 hi 누구(); hi 누구(); 메소드를 다 새로 만들어야 했다.
- 매개변수를 받게 해 주는 메소드 오버 로딩을 통해서
- 달라지는 매개변수 + hi 하나만 만들어서 쉽게 사용할 수 있게 되었다.
3. main 메소드에서 테스트
- 11번 Line - Hi 출력
- 12번 Line - Hi Giggs 출력
- 매소드 오버 로딩이 없었으면 Giggs에게 hi 하기 위해서 hi(giggs) 메소드가 아닌
- hiGiggs()메소드를 새로 만들어서 - t . hiGiggs() 형태로 - hiGiggs() 메소드를 호출해 주었어야 했다.
- + 다른 사람에게 더 인사하고 싶다면? - 매번 새로운 메소드 만들어야 한다.
- 메소드 오버 로딩을 통해 해결
생성자 오버 로딩
- 매개변수를 다르게 하여 생성자를 작성
1. 기본 세팅
- data - 1개
- 기능- 2개 가지고 있는 Test 클래스 만들어 준다.
- 이 클래스로 객체를 만들면 data-1개 기능-2개 가지고 태어날 것이다.
- data 부분인 String name에는 참조형 변수의 기본 값 - null 가지고 있다.
2. 객체 생성될 때부터 null이 아닌 자기의 이름을 가지고 태어나게 해주자.
- this.을 해주는 이유는 이 객체의 이름은 이라고 세팅해주기 위해서
- 메인에서 – Test t = new Test(); 만들고 t.name =“심원용 ” 해주는 작업을 없애기 위해서
- 이름이 없는 객체는 존재할 수 없도록 해주기 위해서
3. 생성자 오버 로딩 : 매개변수를 받고, 이름으로 세팅해주자
- 모든 객체에 심원용이라는 이름을 주는 것이 아니라 그때그때마다 입력받은 이름으로 생성되게 하고 싶다.
- 생성자 오버 로딩을 통하여 객체 생성과 동시에 문자열을 입력 - 전달받아 이름을 세팅하도록 해보자.
- Test(String s) { this . name = s; }
- 메인에서 – Test t = new Test(“심원용”); - 생성하는 동시에 문자열을 전달 – 문자열로 this.name에 세팅!
4. 메인에서 오버 로딩한 생성자 호출해서 사용해보기
- 생성자의 매개변수로 문자열 넣어주면 된다.
- 기본 생성자를 부르려면 매개변수 없이 호출 – new Test()
- 오버 로딩한 생성자를 부르려면 매개변수 넣어줘서 호출 – new Test(“문자열”);
- 생성자 2개 만들었다고 객체 2개 만들어지는 것이 아니다 - 생성자를 호출할 때 객체가 생성되는 것이다.
- public Test(){ } 이건 기본 생성자인데
- { } 중괄호 안에는 실행되는 내용이 담겨있는데 이 {} 중괄호 안에 “create “ 객체를 만들어주는 기능이 들어있는 것이다~ 우리 눈에는 안 보이는 것이다.
총 정리
- 메소드 오버 로딩 : 같은 이름의 메소드를 여러 개 만드는 것
- 생성자 오버 로딩 : 같은 이름의 생성자를 여러 개 만드는 것
- ( 단, 이름만 같은 거임. 매개변수는 달라야 함 )
- ( 리턴 타입은 – 오버 로딩이랑 상관 X )
+메소드 오버 로딩
- hi(){ }
- hi(int x){ }
- 이름(함수명, 클래스명)만 같다고 같은 게 아니라 컴퓨터는
- [ 메서드명 + 매개변수 타입 + 매개변수의 수 ]가 같아야 같은 함수라고 취급
- 리턴 타입과 접근 제한자는 상관없다. ( 같거나 다르거나 - 신경 안 쓴다.)
>변수명이 같다고 같은 변수다 X 아니다.
>parameter 가 다르면 다른 메소드로 취급된다.
>파라미터를 다르게해서 같은 변수명의 메소드를 여러 개 만들 수 있다.
+생성자 오버 로딩
>생성자명(클래스명)은 똑같지만 매개변수(파라미터) 타입과 개수만 다르게 하면 사용 가능
review
수업 초반에는 KFC 주문받는 프로그램을 실습하였다.
메소드를 사용하고 인자 값을 가지고 호출하는 부분
실습을 마치고
생성자와 오버 로딩에 대해 학습하였다.
생성자를 만들어 주는 방법과 생성자의 특징
메소드 오버 로딩과 생성자 오버 로딩
특별히 새로웠던 부분은 없었다.
함수명이 똑같은 여러 가지 메소드를 만들어 보면서
return 타입과 접근 제한자는
상관없다는 부분을 확인한 것이
살짝 새로웠던?ㅎㅎ
진도가 점점 나가고 있다.
실습하는 프로그램도 점점 더 재밌어지고 있다.ㅎㅎ
오버라이드, 상속, 가상 클래스 등등 배워서
더 재밌는 프로그램들로 실습해보고 싶다!