-
(국비교육) 12 - 오버로딩 + 오버라이딩 + 생성자 + this() + static + 정보처리기사 문제개발/국비교육 2023. 6. 16. 17:51
■ 지난주 복습
* add 메소드 생성하여 호출해보기
add 메소드 호출하여 입력받은 두 값을 더하고 출력한다.
■ 메소드 오버로딩
파라미터 갯수가 다르면 다른 메소드라고 인지하고 같은 이름을 쓸 수 있다.
그러나 갯수가 같다면 같은 메소드라고 인식하여 오류가 뜬다.
파라미터 내 갯수가 같아도 다른 데이터타입을 가진다면 다른 메소드라고 인식한다.
즉, 이름이 같아도 파라미터의 수, 순서, 타입(시그니쳐)이 다르면 다른 메소드로 인지 (=메소드 오버로딩)
- 메소드 오버로딩(overloading)
같은 이름의 메소드를 중복하여 정의하는 것을 의미한다.자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없는데,
매개변수의 개수나 타입을 다르게 하면 하나의 이름으로 메소드를 작성할 수 있다.
★자바 면접 시 자주 묻는 질문 (찾아보기)
1. 오버로드 / 오버로딩? = 같은 이름의 메소드, 메소드 시그니쳐
= 한 클래스 내에서는 같은 이름의 메소드가 있으면 안된다.
= 파라미터가 다르면 같은 이름으로 메소드명을 만들 수 있다.
= 파라미터의 갯수, 순서, 타입이 다르면 다른 메소드
= 메소드 호출할 때 파라미터로 구분해서 호출※ 단, 똑같은 이름의 변수는 만들지 못한다.
2. 오버라이딩 / 오버라이딩 = (상속, 부모자식 관계) (p.310)
= 상위(부모) 클래스에 있는 메소드와 동일한 메소드를
= 하위(자식) 클래스에서 재정의 해서 사용하는 것
3. 인터페이스 (p.370)= 자바는 다중 상속이 불가능 -> 이를 극복하기 위해 나옴
= 인터페이스는 스스로 객체를 생성하지 못함. 상속용도로 사용하기 위함.
= 인터페이스는 미구현 메소드(바디가 없음)로 구성됨.* 무한 입력 메소드 설정하기
... 을 통해 i 라는 임의의 배열에 무한으로 입력값을 받을 수 있다.
■ 생성자
- 인스턴스를 만들어주며 객체의 초기화 담당
- ○c 붙여져 있음.
- 클래스명과 동일, 대문자로 시작, 리턴 타입 X
- 생성자가 없는 경우 자바가 만들어 줍니다.
- 파라미터 속이 비어있다.
- 메소드처럼 생성자를 호출해서 사용할 수 없다.
생성자에 기본 값을 넣어주면 객체를 생성 시에도 값을 넣어줘야 한다.
Human() 은 별도 생성자가 없어 자바가 기본 생성자를 만들어준다.
기본 생성자로 만들어진 인스턴스를 기본 객체라고 한다.
생성자는 인스턴스를 만들때만 사용한다.
생성자도 동일하게 오버로딩 가능하다.
■ 생성자 정리
- 생성자란 클래스가 객체화 되어질 때 실제 객체를 생성해주는 코드이다.
- 생성자는 그 외에도 아래와 같은 일을 한다.
1. 클래스의 객체 생성
2. 멤버필드 초기화
3. 필요에 따라서 초기화 메소드 실행
위 내용을 다시 정의하면 생성자가 없다면 인스턴스를 발생시킬 수 없다.
* 생성자의 형식- 생성자는 메소드와 유사한 형식을 가지고 있다.
- 하지만 메소드와 기능적인 부분에서 차이가 있다.
1. 생성자의 이름은 반드시 클래스명과 같아야 한다. 만약 다르다면 메소드로 인식한다.
2. 메소드가 아니기 때문에 리턴 타입이 없다.* 기본 생성자(Default Constructor)
- 자바에서는 모든 클래스마다 컴파일 할 때 기본 생성자를 넣어준다.
- 단, 클래스에 생성자가 하나라도 있다면 제공되지 않습니다.
- 즉, 프로그래머가 생성자를 만들지 않았다면 자바가 제공해주는 생성자.- 파라미터가(매개변수)가 없는 생성자이고 이를 이용해서 생성된 인스턴스를 기본 객체라고 한다.
- 또한 모든 필드의 값은 기본값으로 초기화 됩니다.http://www.tcpschool.com/java/java_methodConstructor_constructor
https://ko.wikipedia.org/wiki/%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98
■ this
외부에서 입력받은 매개변수를 필드값으로 저장하기 위해서는 this. 를 쓰면 된다.
그러면 내 인스턴스 변수로 저장할 수 있다.
클래스 내부에서는 this. 이 가능하다 그러나 외부 class 에서는 불가능하다.
this 는 내부 동작에서 사용하기 위한 것이다. (내부 동작용)
static 이 있는 곳에서는 this 사용 불가
- this.변수
- this(); : 내 생성자()- super.변수 : 부모의 변수
- super() : 부모의 생성자()입력값을 받고 if 를 통해 제한을 둘 수 있다. age 값을 -1로 받았기 때문에 age 값이 0이 된다.
* 동물원 만들기
필드값으로 이름과 나이를 설정하고, 생성자에서 바로 출력될 수 있도록 설정해준다.
메인 메소드에서는 실행을 위해 dog 객체를 생성해주고, 입력값을 넣어주면 출력된다.
■ this() (생성자 오버로딩_p.238)
this.name 을 반복사용할 수도 있지만 this( ) 를 통해 생성자를 호출해서 사용하는 방법도 있다.
* 생성자 호출 (생성자 오버로딩)
- 같은 클래스에서 정의된 다른 생성자를 호출하는 키워드 this();
- 호출하려면 생성자의 파라미터의 순서에 맞게 호출하면 자동으로 호출됩니다.
- 단 this 생성자 호출은 생성자 첫줄에만 호출 가능합니다. (두 번째 줄 불가능)
- 호출은 단 한번만 가능합니다.■ 자동차 만들기 (p. 241)
둘 다 String 타입이기 때문에 오류는 나지 않지만 내용이 바뀌어서 나온다.
따라서 입력하는 값에 맞는 변수를 설정해서 배치해준다.
this(); 는 반드시 첫번째 줄에 있어야 하고,
만약 여러개를 표현하려면 this(model, color); 처럼 설정해줘야 한다.
생성자 오버로딩을 통해 호출해보면 car4 는 String model, String color, int maxSpeed 값을 가져간다.
이 값은 this(model, color) 을 참조하고, this(model, color) 은 this(model) 을 참조한다.
model 은 this() 를 참조하여 "자동차를 만듭니다." 를 출력하게 된다.
이후 나머지 입력받은 값도 출력한다.
■ static
필드에는 인스턴스 변수와 클래스 변수가 있다.
클래스 변수는 딱 한번만 생기고 안 만들어짐. = 클래스명.변수명
인스턴스 변수는 객체를 따라가는 값 = 인스턴스변수명.변수명
static 은 클래스 변수로 클래스명.변수명으로 생성한다.
EX) Car.company = "현대자동차 입니다."
하나를 만들어서 공유함(공유변수). 값이 바뀌지 않는 값을 설정할 때 주로 사용
EX) 변경하지 않는 제조사
절대 바뀌지 않는 값은 final 사용
EX) 파이값(3.14)
모든 값에 company 들어가니까 static 클래스 변수로 만들어준다.
* static 정리
- static 은 정적 이라는 의미가 있다.
- 자바에서는 정적 개념과 동적 개념이 있다.
- 정적은 클래스가 로드되는 시점이고 동적은 로드된 클래스가 실행되는 이후를 이야기한다.
- 이 중 객체는 동적 데이터로 프로그램이 실행된 이후에 발생되는 형태이다.static count 의 경우 count 값을 공유한다.
따라서 Counter.count 를 했을 때 3이 나오게 된다.
반대로 static 이 없는 각 c1 c2 c3 는 각각 count 값을 1씩 가진다.
따라서 c3.count 를 출력하면 1 이 나온다.
https://chobopark.tistory.com/217
https://chobopark.tistory.com/210
https://chobopark.tistory.com/372
'개발 > 국비교육' 카테고리의 다른 글