챕터 3: 객체 지향 프로그래밍
Java는 객체 지향 프로그래밍(OOP)을 지원하는 언어로, 객체와 클래스를 사용하여 프로그램을 작성할 수 있습니다. 이 장에서는 Java의 객체 지향 프로그래밍 개념을 다양한 코드와 예시를 통해 상세히 설명합니다.
3.1 클래스와 객체
클래스는 객체를 정의하는 틀이며, 객체는 클래스의 인스턴스입니다.
3.1.1 클래스 선언
클래스는 속성과 메서드를 포함할 수 있습니다.
예제: 클래스 선언
public class Person {
// 속성(필드)
String name;
int age;
// 메서드
void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
설명:
- 클래스: Person 클래스는 name과 age라는 두 개의 속성을 가지고 있습니다. 또한 introduce라는 메서드를 포함하고 있습니다.
- 메서드: introduce 메서드는 객체의 속성을 출력합니다.
3.1.2 객체 생성
객체는 new 키워드를 사용하여 생성할 수 있습니다.
예제: 객체 생성
public class Main {
public static void main(String[] args) {
// 객체 생성
Person person = new Person();
// 객체의 속성 설정
person.name = "John";
person.age = 30;
// 메서드 호출
person.introduce();
}
}
설명:
- 객체 생성: new Person()은 Person 클래스의 새 객체를 생성합니다.
- 속성 설정: person.name과 person.age를 사용하여 객체의 속성을 설정합니다.
- 메서드 호출: person.introduce()를 호출하여 객체의 메서드를 실행합니다.
3.2 생성자
생성자는 객체를 생성할 때 호출되는 특수한 메서드입니다. 생성자는 클래스 이름과 동일해야 하며, 반환 타입이 없습니다.
예제: 생성자
public class Person {
String name;
int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
public class Main {
public static void main(String[] args) {
// 생성자를 사용하여 객체 생성
Person person = new Person("John", 30);
person.introduce();
}
}
설명:
- 생성자: Person 클래스의 생성자는 객체가 생성될 때 name과 age를 초기화합니다.
- this 키워드: this 키워드는 객체 자신을 참조합니다. 생성자에서 매개변수와 필드를 구분하기 위해 사용됩니다.
3.3 상속
상속은 기존 클래스를 기반으로 새로운 클래스를 정의하는 기능입니다. 상속을 통해 코드의 재사용성을 높일 수 있습니다.
예제: 상속
// 부모 클래스
public class Animal {
String name;
void eat() {
System.out.println(name + " is eating.");
}
}
// 자식 클래스
public class Dog extends Animal {
void bark() {
System.out.println(name + " is barking.");
}
}
public class Main {
public static void main(String[] args) {
// Dog 객체 생성
Dog dog = new Dog();
dog.name = "Buddy";
dog.eat(); // 상속받은 메서드 호출
dog.bark(); // 자식 클래스의 메서드 호출
}
}
설명:
- 부모 클래스: Animal 클래스는 name 필드와 eat 메서드를 가집니다.
- 자식 클래스: Dog 클래스는 Animal 클래스를 상속받아 bark 메서드를 추가로 정의합니다.
- 상속: Dog 클래스는 Animal 클래스의 모든 속성과 메서드를 상속받습니다.
3.4 다형성
다형성은 동일한 인터페이스를 통해 서로 다른 데이터 타입을 처리할 수 있게 하는 기능입니다. 다형성은 주로 상속과 인터페이스를 통해 구현됩니다.
예제: 다형성
// 부모 클래스
public class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
// 자식 클래스
public class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}
public class Cat extends Animal {
@Override
void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
// 다형성 예제
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 출력: Dog barks
myCat.sound(); // 출력: Cat meows
}
}
설명:
- 다형성: Animal 타입의 변수 myDog와 myCat은 각각 Dog와 Cat 객체를 참조합니다.
- 메서드 오버라이딩: Dog와 Cat 클래스는 Animal 클래스의 sound 메서드를 오버라이딩하여 각각의 방식으로 동작을 정의합니다.
3.5 인터페이스
인터페이스는 클래스가 구현해야 하는 메서드의 집합을 정의하는데 사용됩니다. 인터페이스를 사용하면 클래스의 동작을 규격화하고, 서로 다른 클래스 간의 상호 운용성을 높일 수 있습니다.
예제: 인터페이스
// 인터페이스 정의
public interface Animal {
void sound();
}
// 인터페이스 구현
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Cat implements Animal {
@Override
public void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
// 인터페이스 타입의 변수로 객체 참조
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 출력: Dog barks
myCat.sound(); // 출력: Cat meows
}
}
설명:
- 인터페이스 정의: Animal 인터페이스는 sound 메서드를 선언합니다.
- 인터페이스 구현: Dog와 Cat 클래스는 Animal 인터페이스를 구현하고, sound 메서드를 오버라이딩하여 각각의 동작을 정의합니다.
- 인터페이스 타입의 변수: Animal 타입의 변수 myDog와 myCat은 각각 Dog와 Cat 객체를 참조합니다.
3.6 캡슐화
캡슐화는 객체의 속성과 메서드를 하나로 묶고, 외부에서 객체의 세부 구현을 숨기는 것입니다. 이를 통해 데이터 보호와 코드 유지보수를 용이하게 합니다.
예제: 캡슐화
public class Person {
// private 접근 제어자를 사용하여 필드 은닉
private String name;
private int age;
// public 메서드를 통해 필드에 접근
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0) {
this.age = age;
}
}
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성
Person person = new Person();
// setter 메서드를 사용하여 필드 설정
person.setName("John");
person.setAge(30);
// getter 메서드를 사용하여 필드 접근
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
// 메서드 호출
person.introduce();
}
}
설명:
- 필드 은닉: private 접근 제어자를 사용하여 name과 age 필드를 외부에서 직접 접근할 수 없게 합니다.
- 접근자 메서드: getName, setName, getAge, setAge 메서드를 통해 필드에 접근하고 값을 설정합니다.
- 데이터 검증: setAge 메서드에서 나이를 설정할 때 유효성을 검사하여 잘못된 값이 설정되지 않도록 합니다.
3.7 추상 클래스
추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있는 클래스입니다. 추상 메서드는 구현이 없는 메서드로, 서브 클래스에서 반드시 오버라이딩해야 합니다.
예제: 추상 클래스
// 추상 클래스 정의
public abstract class Animal {
// 추상 메서드
public abstract void sound();
// 일반 메서드
public void sleep() {
System.out.println("Animal is sleeping");
}
}
// 추상 클래스를 상속받아 추상 메서드 구현
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
// 추상 클래스는 인스턴스화 할 수 없음
// Animal animal = new Animal(); // 오류 발생
// 추상 클래스를 상속받은 클래스의 객체 생성
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 출력: Dog barks
myDog.sleep(); // 출력: Animal is sleeping
myCat.sound(); // 출력: Cat meows
myCat.sleep(); // 출력: Animal is sleeping
}
}
설명:
- 추상 클래스 정의: Animal 클래스는 추상 메서드 sound와 일반 메서드 sleep을 포함합니다.
- 추상 메서드: sound 메서드는 추상 메서드로, 서브 클래스에서 반드시 구현해야 합니다.
- 일반 메서드: sleep 메서드는 일반 메서드로, 서브 클래스에서 재정의하지 않고 사용할 수 있습니다.
- 추상 클래스의 인스턴스화 불가: 추상 클래스는 직접 인스턴스화할 수 없으며, 이를 상속받은 서브 클래스만 인스턴스화할 수 있습니다.
이로써 Java의 객체 지향 프로그래밍 개념에 대해 자세히 설명하고, 각 개념을 코드와 예시를 통해 설명했습니다. 이를 통해 클래스와 객체, 생성자, 상속, 다형성, 인터페이스, 캡슐화, 추상 클래스 등의 기본 개념과 사용법을 이해하고 활용할 수 있게 됩니다. 다음 챕터에서는 기본클래스 사용에 대해 다루겠습니다.
'IT 강좌(IT Lectures) > Java' 카테고리의 다른 글
5강. Java API 활용 (0) | 2024.06.22 |
---|---|
4강. 기본 클래스 사용 (0) | 2024.06.21 |
2강. Java 기본문법 (0) | 2024.06.19 |
1강. 시작하기 (0) | 2024.06.18 |
자바의 역사 (0) | 2023.05.23 |