[내배캠]자바 문법 뽀개기-객체지향언어

손홍서·2022년 5월 16일
0

Java

목록 보기
2/11
post-thumbnail

객체지향언어

클래스

  • 클래스는 표현하고자 하는 대상의 공통 속성을 한 군데에 정의해 놓은 것
  • 객체의 속성과, 객체를 활용하는 메소드를 한 군데에 정의

메소드

  • 어떠한 작업을 수행하는 코드를 하나로 묶어놓은 것
  • 재사용성이 가능해지고, 중복 코드가 제거되며, 프로그램이 구조화된다.

인스턴스

어떠한 클래스로부터 만들어진 객체

생성자

  • 인스턴스가 생성될때 사용되는 인스턴스를 초기화하는 메소드이다.
  • 생성자를 특별히 정의하지 않는 경우 자바 컴파일러가 기본 생성자를 추가해준다.

상속

  • 기존 클래스를 재사용하는 방식 중의 하나로 한 번 작성한 코드가 재사용이 필요하면 변경사항만 코드로 작성하므로 상대적으로 적은 양의 코드를 작성 가능
  • 상속의 특징
    • 부모 클래스에 정의된 필드와 메소드를 물려받음
    • 새로운 필드와 메소드 추가 가능
    • 부모 클래스에서 물려받은 메소드 수정 가능

오버로딩

  • 한 클래스 내 동일한 이름의 메소드를 여러개 정의하는 것
  • 오버로딩 조건
    • 메소드 이름 동일
    • 메개변수의 개수 혹은 타입이 달라야 함
class Calculation {
    //오버로딩
    int add(int x, int y, int z) {
        return x + y + z;
    }

    int add(int x, int y) {
        return x + y;
    }
}

오버라이딩

  • 부모 클래스로부터 상속받은 메소드의 내용을 변경하는 것
  • 오버라이딩 조건
    • 부모 클래스의 메소드와 이름이 같아야 함
    • 부모 클래스의 메소드와 매개변수가 같아야 함
    • 부모 클래스의 메소드와 반환타입이 같아야 함
class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void cry() {
        System.out.println(name + " is crying.");
    }
}

class Dog extends Animal {

    public Dog(String name) {
        super(name);
    }

    //오버라이딩
    @Override
    public void cry() {
        System.out.println(name+ " is barking.");
    }

    public void swim() {
        System.out.println(name + " is swimming.");
    }
}

public class Inheritance {
    public static void main(String[] args) {
        Dog dog = new Dog("coco");
        dog.cry();
        dog.swim();

        Animal dog2 = new Dog("mimi");
        dog2.cry();
//        dog2.swim();  Animal에는 swim이 정의되지않아서 오류남
    }
}

접근제어자

접근 제어자는 멤버 변수/함수 혹은 클래스에 사용되며 외부에서의 접근을 제한하는 역할

  1. private : 같은 클래스 내에서만 접근이 가능

  2. default(nothing) : 같은 패키지 내에서만 접근이 가능

  3. protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능

  4. public : 접근 제한이 전혀 없음

  5. private(좁음) → default → protected → public(넓음)

추상클래스

  • 추상클래스는 추상메소드를 선언할 수 있는 클래스
  • 추상클래스는 클래스와는 다르게 상속받는 클래스 없이 그 자체로 인스턴스를 생성할 수는 없다.
abstract class Bird {
    private int x, y, z;

    void fly(int x, int y, int z) {
        printLocation();
        System.out.println("이동합니다.");
        this.x = x;
        this.y = y;

        if (flyable(z)) {
            this.z = z;
        } else {
            System.out.println("그 높이로는 날 수 없습니다.");
        }

        printLocation();
    }

    abstract boolean flyable(int z);

    void printLocation() {
        System.out.println("현재위치 { " + x + " ," + y + ", " + z + " }");
    }

}

class Pigeon extends Bird {

    @Override
    boolean flyable(int z) {
        return z < 10000;
    }
}

class Peacock extends Bird {

    @Override
    boolean flyable(int z) {
        return false;
    }
}
public class Abstract {
    public static void main(String[] args) {
//        Bird bird = new Bird();   추상메소드가 존재하므로 인스턴스를 만들 수 없다.
        Bird pigeon = new Pigeon();
        Bird peacock = new Peacock();
        System.out.println("-----비둘기-----");
        pigeon.fly(1,1,3);
        System.out.println("-----공작새-----");
        peacock.fly(1, 1, 3);
        System.out.println("-----비둘기-----");
        pigeon.fly(3, 3, 30000);
    }
}

인터페이스

  • 인터페이스는 객체의 특정 행동의 특징을 정의하는 간단한 문법
  • 인터페이스는 함수의 특징(method signature)인 접근제어자, 리턴타입, 메소드 이름만을 정의
  • 함수의 내용은 xxx
  • 인터페이스를 구현하는 클래스는 인터페이스에 존재하는 함수의 내용({} 중괄호 안의 내용)을 반드시 구현해야한다.
interface Flyable {
    void fly(int x, int y, int z);
}

class Pigeon2 implements Flyable {
    private int x, y, z;
    @Override
    public void fly(int x, int y, int z) {
        printLocation();
        System.out.println("이동합니다.");
        this.x = x;
        this.y = y;
        this.z = z;
        printLocation();
    }
    void printLocation() {
        System.out.println("현재위치 { " + x + " ," + y + ", " + z + " }");
    }
}

public class InterfacePractice {
    public static void main(String[] args) {
        Flyable pigeon = new Pigeon2();
        pigeon.fly(1, 2, 3);
    }

}
profile
Hello World!!

0개의 댓글