티스토리 뷰
클래스란
클래스는 객체 지향 프로그래밍 (OOP)에서 핵심적인 개념으로, 코드를 구조화하고 재사용 가능한 방식으로 프로그램을 작성할 수 있게 해줍니다. 클래스는 관련된 데이터와 기능을 묶어 하나의 '틀' 또는 '설계도'로 사용되며, 이를 바탕으로 객체(Object)를 생성합니다. 객체는 클래스의 인스턴스로, 클래스에서 정의된 속성과 메소드를 가집니다.
클래스의 구성
속성(Attributes) : 클래스에 속하는 변수
메소드(Methods) : 클래스에 정의된 함수, 객체의 동작을 나타낸다
import
서로 다른 패키지에 있는 클래스를 참조하기 위해 사용한다.
한 클래스의 소스 파일에 여러번의 import를 할 수 있다.
클래스를 선언하기 이전에 명시를 해야 하고, 패키지 선언 다음에 명시해야 한다.
추상클래스(Abstract Class)
- 추상 메소드가 존재하는 클래스
- 자식클래스에서 추상메소드를 오버라이딩하여 구현
abstract class Animal {
// 추상 메소드
abstract void makeSound();
// 일반 메소드
void sleep() {
System.out.println("The animal is sleeping.");
}
}
class Dog extends Animal {
// 추상 메소드 구현
void makeSound() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound();
dog.sleep();
}
}
2. 추상메소드가 존재하지 않는 클래스
- 추상클래스는 직접 코드에서 new 연산을 사용하지 못한다.
- 즉, 객체를 생성하지 못한다.
abstract class Vehicle {
// 일반 메소드
void start() {
System.out.println("The vehicle starts.");
}
void stop() {
System.out.println("The vehicle stops.");
}
}
class Car extends Vehicle {
void honk() {
System.out.println("The car honks.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.start();
car.stop();
car.honk();
}
}
오버로딩
하나의 클래스 내에서 같은 이름의 메소드를 여러 개 정의
매개변수 유형, 개수, 순서가 다르다
반환 유형도 달라질 수 있다.
class MathOperations {
// 오버로딩된 메소드들
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
오버라이딩과 상속
상속 관계에 있는 하위 클래스가 상위 클래스의 메소드를 재정의 하는것
매개변수와 반환 유형이 상위 클래스의 메소드와 동일해야한다.
Dog클래스는 Animal클래스를 상속받게 된다 오버라이딩 이기 때문에 반환형과 매개변수가 같아야하고
안에 메소드내용만 변경이 가능하다.
class Animal {
void makeSound() {
System.out.println("The animal makes a sound.");
}
}
class Dog extends Animal {
// 오버라이딩된 메소드
@Override
void makeSound() {
System.out.println("The dog barks.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 출력: The dog barks.
}
}
인터페이스
인터페이스는 객체 지향 프로그래밍에서 클래스가 구현해야 하는 메소드 명세를 정의하는 설계 도구
추상 메소드의 집합이며 이를 구현하는 클래스는 해당 인터페이스에서 정의된 모든 메소드를 구현해야 한다
인터페이스의 주요 특징
- 추상화 : 세부 정보 없이 메소드의 시그니처(이름, 매개변수, 반환 타입)만 제공
- 다중 상속 : JAVA와 같은 언어에서 클랫느느 한 번에 하나의 클래스만 상속받을 수 있지만, 인터페이스는 여러 개를 동시에 구현 가능하다.
- 계약 : 인터페이스는 클래스가 어던 메소드를 구현해야 하는지를 정의하는 계약 역할을 합니다. 이를 통해 프로그래머들은 클래스 간의 상호 작용을 더 쉽게 이해할 수 있다.
예시
// 인터페이스 정의
interface Swimmable {
void swim();
}
interface Flyable {
void fly();
}
// 인터페이스를 다중 구현하는 클래스
class Duck implements Swimmable, Flyable {
@Override
public void swim() {
System.out.println("The duck is swimming.");
}
@Override
public void fly() {
System.out.println("The duck is flying.");
}
}
public class Main {
public static void main(String[] args) {
Duck duck = new Duck();
duck.swim(); // 출력: The duck is swimming.
duck.fly(); // 출력: The duck is flying.
}
}