이번주는 상속과 인터페이스에 대한 개념을 정리하는 시간이다.
특히나 상속과 인터페이스는 많이 쓰는 개념이므로 정리를 하는 것이 좋아보인다.
class Animal {
void walk() {
System.out.println("Walking");
}
}
class Cat extends Animal {
void meow() {
System.out.println("Meowing");
}
}
다음과 같은 예시를 통해서 cat 클래스가 animal 클래스를 상속받아서 사용되는 것을 알 수 있다.
이떄 animal 에서 정의된 메서드와 변수 또한 cat 클래스에서 사용할 수 있다.
다음 예시와 같은 경우에는 walk 메서드도 cat 클래스에서 쓸 수 있다는 말이다.
interface Drawable {
void draw();
}
class Circle implements Drawable {
void draw() {
System.out.println("Drawing Circle");
}
}
즉 추상클래스는 추상 메서드를 가질 수 있으며, 구체적인 구현을 하위 클래스에서만 할 수 있다. 인터페이스는 메서드의 구조만 정의할 수 있고, 인스턴스화 할 수 없다.
둘이 코드로만 보면 비슷해 보이기는 한다.
다음과 같은 예시를 들어보자.
// 추상 클래스: Vehicle
abstract class Vehicle {
abstract void accelerate();
abstract void stop();
abstract void turn();
}
// 추상 클래스를 상속받은 클래스: Car
class Car extends Vehicle {
void accelerate() {
// 구현
}
void stop() {
// 구현
}
void turn() {
// 구현
}
}
// 인터페이스: VehicleOperations
interface VehicleOperations {
void accelerate();
void stop();
void turn();
}
// 인터페이스를 구현한 클래스: Car
class Car implements VehicleOperations {
void accelerate() {
// 구현
}
void stop() {
// 구현
}
void turn() {
// 구현
}
}
다음 예시를 한번 더 보자
abstract class Shape {
abstract double area();
}
class Circle extends Shape {
double radius;
Circle(double radius) {
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
}
interface Drawable {
void draw();
}
class Square implements Drawable {
double side;
Square(double side) {
this.side = side;
}
@Override
public void draw() {
// Draw a square
}
}
Circle c = new Circle(5);
Square s = new Square(6);
abstract class Shape {
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("Drawing Circle");
}
}
public class Main {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
}
다음 예시도 확인해보자.
abstract class Shape {
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("Drawing Circle");
}
}
class Square extends Shape {
void draw() {
System.out.println("Drawing Square");
}
}
public class Main {
public static void main(String[] args) {
Shape shape1 = new Circle();
Shape shape2 = new Square();
shape1.draw(); // Output: Drawing Circle
shape2.draw(); // Output: Drawing Square
}
}
interface Drawable {
void draw();
}
class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
class Rectangle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a Rectangle");
}
}
class Square implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a Square");
}
}
public class Main {
public static void main(String[] args) {
Drawable[] shapes = {new Circle(), new Rectangle(), new Square()};
for (Drawable shape : shapes) {
shape.draw();
}
}
}