1. 생성자
- 객체가 생성될 때 필수적으로 수행해야하는 작업을 처음에 세팅해 놓는 것
- 생성자의 이름은 클래스의 이름과 동리해야 한다.
- 값을 반환하지 않는다.
- 클래스에 생성자가 지정되지 않는 경우에는 묵시적 생성자가 자동으로 생성된다. (묵시적 생성자는 매개변수를 사용할 수 없다)
package org.opentutorials.javatutorials.constructor;
class Calculator {
int left, right;
public Calculator(int left, int right) { //생성자, Calculator 객체를 만들때 무조건 left와 right의 값을 지정하게 함
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator(10, 20);
c1.sum();
c1.avg();
Calculator c2 = new Calculator(20, 40);
c2.sum();
c2.avg();
}
}
2. 생성자의 여러가지 경우
1) 묵시적 생성자가 없는 경우
class Cons1{
public int num; //생성자 없이 클래스 생성
}
public class Constest1 {
public static void main(String args[]) {
Cons1 cons = new Cons1(); //클래스로부터 객체 생성 가능
}
}
2) 묵시적 생성자를 지정하는 경우
class Cons2{
public int num;
System.out.println("묵시적 생성자"); //매개변수가 없는 묵시적 생성자 선언
}
public class Constest2 {
public static void main(String args[]) {
Cons2 cons = new Cons2(); //"묵시적 생성자"출력
}
}
3) 명시적 생성자가 있는 경우
class Cons3{
public int num;
public Cons3(String s){ //매개변수가 있는 명시적 생성자 선언, 클래스 이름과 동일해야함
System.out.println("묵시적 생성자");
}
}
public class Constest3 {
public static void main(String args[]) {
Cons2 cons = new Cons3("1번쨰"); // 매개변수가 있는 경우
//Cons3 cons2 = new Cons3(); : 오류 발생, 해당되는 생성자가 없다.Cons3은 무조건 매개변수가 있어야 함.
//명시적 생성자가 하나라도 있으면 묵시적 생성자를 사용하기 위해서는 반드시 정의해야 한다.
}
}
//1번째 명시적 생성자 출력
2. super
* super키워드는 부모 클래스를 의미한다. 여기에 ()를 붙이면 부모 클래스의 생성자를 의미하게 된다.
* super가 가장 먼저 나타나야 한다. 그 후 초기화 코드를 적어야 한다. 부모가 초기화 되기 전에 자식이 초기화 되는 일을 방지하기 위해
3. overriding (재정의)
* 상위 클래스의 기능을 하위 클래스가 물려 받을 때 수정할 수 있는 방법
- 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 경우
주의 **메소드 오버로딩 : 같은 클래스 내에서 같은 이름의 생성자나 메소드를 사용하는 경우
* 오버라이딩을 하기 위해서는 메소드의 리턴 형식이 같아야 한다.
- 메소드의 이름
- 메소드 매개변수의 숫자와 데이터타입 그리고 순서
- 메소드의 리턴 타입
* 만약 부모와 자식이 똑같은 코드를 갖고 있는 경우(중복을 제거하기 위해) : super를 사용
class Calculator {
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public int avg() {
return ((this.left + this.right) / 2);
}
}
class SubstractionableCalculator extends Calculator { //Calculator를 상속받는 SubstractionableCalculator 클래스
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
public int avg() {
return super.avg(); //부모클래스의 avg를 호출, 즉 (this.left + this.right) / 2 출력
}
4. overloading
* 이름은 같지만 다른 메소드를 중복으로 선언하는 방법
* 메소드의 매개변수의 갯수, 형식이 다르다면 다른 메소드로 인식
package org.opentutorials.javatutorials.overloading.example1;
class Calculator{
int left, right;
int third = 0;
public void setOprands(int left, int right){ //setOprands메소드 (2개의 매개변수)
System.out.println("setOprands(int left, int right)");
this.left = left;
this.right = right;
}
public void setOprands(int left, int right, int third){ //setOprands메소드 (3개의 매개변수)
System.out.println("setOprands(int left, int right, int third)");
//this.left = left;
//this.right = right; 여기서 this.left와 this.right는 위의 2개의 매개변수와 중복되므로
this.setOprands(int left, int right) //left와 right는 위와 동일한 것으로 사용한다.
this.third = third;
}
public void sum(){
System.out.println(this.left+this.right+this.third);
}
public void avg(){
System.out.println((this.left+this.right+this.third)/3);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20); //매개변수가 2개인 메소드를 사용
c1.sum();
c1.avg();
c1.setOprands(10, 20, 30); //매개변수가 3개인 메소드를 사용
c1.sum();
c1.avg();
}
}
5. 오버로딩의 규칙
package org.opentutorials.javatutorials.overloading.example1;
public class OverloadingDemo {
void A (){System.out.println("void A()");} //매개변수 없음
void A (int arg1){System.out.println("void A (int arg1)");} //매개변수 int로 1개
void A (String arg1){System.out.println("void A (String arg1)");} //매개변수 string으로 1개
//int A (){System.out.println("void A()");} -> 오류 발생, 위의 매개변수 없는 void a()와 헷갈림
public static void main(String[] args) {
OverloadingDemo od = new OverloadingDemo();
od.A(); //매개변수 없는 메소드
od.A(1); //매개변수 int 1개 메소드
od.A("coding everybody"); //매개변수 string 1개 메소드
}
}
* 메소드의 이름은 같고, 매개변수는 같지만 리턴 타입이 다르면 오류가 발생한다. 매개변수의 이름은 달라도 상관 없음
'Java' 카테고리의 다른 글
[Java] Super, this 연습 (0) | 2022.11.20 |
---|---|
[Java] 상속 연습 - 라면 끓이는 프로그램 (0) | 2022.11.20 |
[Java] 생활코딩 | 클래스 멤버, 인스턴스 멤버, 클래스 메소드, 유효범위 (0) | 2022.11.13 |
[Java] 점프 투 자바 연습문제 04장 제어문 (1) | 2022.09.24 |
[Java] 레이블이 있는 break, continue의 사용 (0) | 2022.09.24 |