- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.(생성자도 메서드이기 때문에 리턴값이 없다는 의미의 void를 붙여야
하지만, 모든 생성자가 리턴값이 없으므로 void를 생략할 수 있게 한 것이다.)
class Person {
Person() {
}
Person(int age){
}
}
public class Person {
private int 나이;
public Person(int 나이) {
this.나이 = 나이;
}
}
class Animal {
public void move() {
System.out.println("Animal is moving");
}
}
class Dog extends Animal {
// 오버라이드: 상위 클래스의 move 메서드를 재정의함
public void move() {
System.out.println("Dog is walking");
}
// 오버로딩: 같은 이름의 메서드를 추가함
public void move(int speed) {
System.out.println("Dog is running at speed " + speed);
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = new Dog();
animal.move(); // "Animal is moving" 출력
dog.move(); // "Dog is walking" 출력
dog.move(10); // "Dog is running at speed 10" 출력
}
}
- 매서드 이름이 같아야한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
// 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에 오버로딩이 성립하지 않는다.
int add(int a, int b) {
return a+b;
}
int add(int x, int y) {
return x+y;
}
외부에는 불핑요한, 내부적으로만 사용되는, 부분을 감추기 위해 사용한다.
멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
생성자가 따로 지정이 되어 있지 않다면, 접근 제어자가 defalt다.(생략가능)
default : 같은 패키지 내에서만 접근이 가능하다.
private : 같은 클래스 내에서만 접근이 가능하다.
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public : 접근 제한이 전혀 없다.
abstract class Car{
}
abstract class Car{
abstract void run();
}
class Kia extends Car{
void run(){
추상메서드 구현
}
}
interface 인터페이스이름 extends 클래스명, 클래스명 ... {
public static final 상수 이름 = 값;
public abstract 메서드이름 (매개변수);
}
// interface의 구현
class 클래스명 implements 인터페이스명{
}
class 클래스명 extends 클래스명 implements 인터페이스명
컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 실행 시에 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 작동하는 것
try{
예외가 발생할 수 있는 코드
} catch (예외종류 e1) {
예외 e1발생했을 경우, 이를 처리하기 위한 문장
} catch (예외종류 e2) {
예외 e2발생했을 경우, 이를 처리하기 위한 문장
}