15일차 - java '생성자'
아휴 오늘 버스를 잘못타서 환승을 했는데
둘러서 가는 버스인 바람에 수업시간에 아슬아슬하게 도착했다. ㅠㅜㅠㅜㅠ
오늘 첫 수업에 어제 java 포스팅 마지막에 쓴 예제를 했는데 포스팅 하면서 미리 해놨더니
급하게 수업 시작했어도 금방 텐션 조절할 수 있었다! 예습이 좋긴 좋구나~
어제는 인스턴스를 배웠으니까 오늘은 생성자!
자바 수업 또 시작!
생성자
생성자
자동으로 만들어지는 생성자를 디폴트 생성자라고 한다.
디폴트 생성자는 매개변수가 없고 실행 내용도 없다. 직접 디폴트 생성자를 만들면 매개변수, 실행내용을 넣을 수 있다.
생성자는 리턴 타입(반환자료형)이 있으면 안된다. 그런데 void를 썼다고 오류가 나진 않는데 이유는 메서드로 인식하기 때문이다.
*디폴트 생성자는 클래스와 이름이 같기 때문에 메서드 이름을 클래스와 동일하게 쓰면 안된다.
매개변수를 받는 생성자를 따로 만들면 디폴트 생성자는 사라진다.
따라서 직접 추가를 해 줘야 한다.
생성자를 이용하는 두 가지 방법이 나왔다.
1. 매개변수를 받는 생성자 ( 따로 만든 생성자)
2. Person 클래스에 있는 멤버변수를 사용하는 디폴트 생성자
디폴트 생성자를 이용하는 경우 인스턴스 변수 값을 따로 초기화 한다.
매개변수가 있는 생성자를 이용하면 내부에서 변수를 초기화한다. 코드 깔끔
*데칼코마니처럼 생성자 매개변수가 있으면 인스턴스 생성자에도 매개변수가 있어야 한다.
Person이 생성될 때 반드시 이름과 키, 몸무게가 있어야 한다면 매개변수를 받는 생성자를 만든다.
*매개변수가 있는 생성자를 추가한다고 디폴트 생성자를 추가로 넣을 필요는 없다.
생성자는 오버로딩이 가능하다. 생성자가 두 개 이상 있는 경우를 오버로드라고 한다.
클래스 안에 여러 생성자가 있다면 인스턴스를 만들 때 필요한 생성자를 골라서 쓸 수 있다.
생성자를 오버로딩 할 때는 매개변수의 자료형을 다르게 써야 한다.
변수가 다르다해도 매개변수 전부를 동일한 자료형으로는 오버로딩 할 수 없다.
하지만 동일한 자료형이 있어도 하나라도 다른 자료형이 들어있다면 오버로딩이 된다.
접근제어자
한 클래스에 프로그램에 필요한 멤버변수를 다 때려 넣으면 java가 객체 지향 언어라는 장점을 제대로 살릴 수 없다.
학생 정보를 파악할 수 있는 프로그램을 만들려고 한다.
이 때 위에 한 클래스에 학생 정보를 받을 변수를 다 선언하는 것 보다
- 학생의 신상 정보,
- 학생의 과목별 점수
- 학생이 수강하는 과목
이렇게 관련 있는 부분끼리 묶으면 작업할 때 클래스의 의미 파악이 훨씬 편하다.
Subject 클래스를 새로 만들고 이 클래스 안에는 수강하는 과목 이름과 점수만 받는 변수를 멤버변수로 넣었다.
그리고 Subject 클래스를 또 새로 만든 Student3 클래스에 멤버변수 자료형으로 썼다.
이렇게 클래스를 나눠서 변수를 선언했을 때 변수가 서로 떨어져 있기 때문에 일일히 제어를 할 수가 없다.
그 때 접근제어자를 써서 변수에 값이 들어오는 것을 제어할 수 있다.
studentName변수를 private 접근제어자로 설정해두었다.
이렇게 되면 studentName변수는 Student 클래스에서만 쓸 수 있게 된다.
외부 클래스에서 변수값을 지정할 수 없을 때 get-, set- 메서드를 사용한다.
그리고 public 접근제어자가 안 붙어 있으면 언제 다른 접근제어자가 붙을지 모르기 때문에
모든 상황을 대비하기 위해 get-, set- 메소드를 만들어 둬야 한다.
멤버변수를 바로 사용하는 것보다 get-, set- 메소드를 사용하는 빈도가 더 많다.
이 메소드들이 없을 시 jsp로 작동이 안 될 때도 있다.
접근제어자
접근제어자는 4종류가 있다.
- public -> 같은 패키지가 아닌 다른 경로에 있어도 접근 가능
- protected -> 같은 패키지에 있어야 접근 가능
- default( packaged : 패키지드) -> 같은 패키지에 있어야 접근 가능 + 상속된 클래스
- private
나만의 세상
public에 가까울수록 접근이 자유롭고 private에 가까울수록 접근이 까다롭다.
studentName을 private 접근제어자로 지정하게 되면 Student 클래스 밖에서는 쓸 수가 없다.
The field Student.sthdentName is not visible
이 변수를 못 찾겠다는 오류메세지가 뜬다.
이 때 만들어 놓은 set- 메소드를 사용한면 오류 없이 작동된다.