211230 객체, 클래스, 생성자
*객체 지향 프로그래밍 OOP: Object Oriented Programming
부품이 되는 객체를 먼저 만들고 이것들을 조립해 하나의 완성된 프로그램을 만드는 기법
객체란
물리적으로 존재하는 것
추상적인 것 중 자신의 속성과 동작을 가지는 것
필드(속성)과 메소드(동작)로 구성
특징
1. 캡슐화
2. 상속
3. 다형성
!클래스 구성!
필드: 객체 데이터 저장 -> 속성
생성자: 객체 생성 시 초기화
메소드: 객체 동작 실행 -> 동작
클래스변수
: new 연산자에 의해 리턴된 객체의 주소를 저장 (참조 타입 변수)
: heap 영역의 객체를 사용하기 위해 사용
클래스 변수=new 클래스();
보통 파일 1개엔 클래스 1개가 들어감(파일명과 동일한 클래스명)
이번에 클래스를 두 개 넣어볼것임
이때 main메소드를 가진 클래스(=파일명과 같은 이름을 가진 클래스)만 public으로 선언 가능!
new 연산자
객체를 생성하는 역할
**생성자**
new 연산자에 의해 객체가 생성될 때 호출되어 heap영역에 멤버변수가 저장될 수 있는 공간을 할당하고 객체의 초기화를 담당
- 필드 값 설정, 메소드 호출해 객체 사용할 수 있도록 준비
- 모든 클래스에 반드시 존재하고 하나 이상 가질 수 있음
- 기본생성자: 매개변수가 없는 생성자, 따로 생성자 선언하지 않으면 자동으로 생성됨
※생성자가 하나도 선언되지 않은 경우 객체 생성 시 기본생성자가 자동으로 만들어지지만
매개변수를 가진 생성자가 클래스 내에 존재하는 경우에는 자동으로 만들어지지 않으니
기본 생성자가 필요하다면 반드시 클래스 내에 따로 선언해줘야 함
※생성자의 매개변수명과 필드명이 동일할 경우 매개변수 값이 전달되지 않기 때문에 서로 다른 이름을 지정해줘야함
아니면 멤버변수에 this. 을 붙여 그 변수가 멤버변수라는 것을 선언하고 매개변수를 대입하는 방식을 사용함 (이걸 더 많이 사용함
*.this : 생성자와 메소드 안에서, 멤버변수와 매개변수 이름이 동일한 경우 주로 사용
this.a=a;
this.b=b; <- 이런 형태가 가능해짐
만약 같은 클래스 안에 있는 생성자(또는 메소드)를 호출하는 경우
this(a,b,c); <- 이렇게 한번에 선언하는 것도 가능
매개변수 3개인 생성자를 대리로 호출시켜주는 방식인거지...
하지만 다른 클래스로는 안되고 제약이 많아서 자주 쓰이진 않는다고 한다
거의 this.를 쓰니까 개념만 알아두는 정도로 확인하기
* 생성자 오버로딩Overloading
: 한 개의 클래스에 여러개의 생성자를 정의하는 것
위에 this(a,b) this(a,b,c)라고 하면 생성자가 두개 있는 상황인것임 매개변수 몇개 넣느냐에 따라 해당하는 생성자가 this()로 호출되어 사용되는 것임
*생성자 빠르게 만들고 싶을때
마우스 오른쪽->Source->Generate Constructor using Fields(필드 쓰는 생성자 만든다)
-> Insertion point(어디 만들거냐) ->Access modifier(범위 설정) -> Omit call to default constructor super() (상속받은 super를 생략할거냐고) 이거 체크
이러면 기본적으로 .this를 사용해서 생성자가 만들어짐
* 초기화되어 받은 필드값 중 일부만 바꾸고 싶은 경우
필드가 private가 아니라면 d.year=2018; 처럼 직접 바꿔줄 수 있고
private 등으로 직접 변경 불가능한 경우, 필드가 존재하는 클래스에 값을 변경하는 메소드 SetYear(int year) 같은걸 만든 뒤, 메인에서 d.SetYear(2018); 방식으로 수정
↓이 방법대로 만들기
마우스 오른쪽->Source->Generate Getters and Setters (getters, setters 메소드 만듦) -> Insertion point(어디 만들거냐) ->Access modifier(범위 설정) -> Sort by(정렬방법)
Sort by
1Get Set 한쌍으로 만들건지, Get 먼저 만들고 Set 만들건지 선택
* 접근제어자
예를 들어 바로 위의 캡처 코드에서 멤버변수가 private int year; 로 선언되어있다고 하면 위의 표에 따라 같은 클래스 내부에서만 호출이 가능함 즉 year가 멤버변수로 속한 MyDate06 클래스와 main 메소드가 속한 ConstructorTest06 클래스는 서로 다른 클래스이므로 main에 변수를 선언해 호출시키는 d.year; 같은 방식은 사용할 수 없다. MaDate06에 public (또는 표에서 yes에 해당하는 접근제어자) 메소드를 선언해 그 안에 year 값을 호출시켜 그 값을 타 클래스로 리턴시키는 방식을 사용하거나 해야 함.