객체지향 프로그래밍이 뭐야?
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 데이터와 그 데이터를 처리하는 함수를 객체로 취급하여 프로그래밍하는 방식입니다.
주요 개념은 뭐야?
- 클래스(Class)와 객체(Object): 클래스는 객체를 생성하기 위한 템플릿이며, 객체는 클래스에 정의된 속성과 동작을 가지는 인스턴스입니다.
더보기
클래스와 객체 예시코드
public class Car {
private String color;
public Car(String color) {
this.color = color;
}
public String getColor() {
return color;
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car("Red");
System.out.println("Car color: " + myCar.getColor());
}
}
- 상속(Inheritance): 한 클래스가 다른 클래스의 속성과 메소드를 상속받아 사용할 수 있습니다.
더보기
상속 예시 코드
public class Vehicle {
private int wheels;
public Vehicle(int wheels) {
this.wheels = wheels;
}
public int getWheels() {
return wheels;
}
}
public class Car extends Vehicle {
public Car(int wheels) {
super(wheels);
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car(4);
System.out.println("Wheels: " + myCar.getWheels());
}
}
- 캡슐화(Encapsulation): 데이터(속성)와 데이터를 처리하는 메소드를 하나로 묶고, 외부에서의 무분별한 접근을 제한합니다.
- 정보 은닉 (Information Hiding) :정보 은닉은 객체의 세부 구현 내용을 외부로부터 숨기는 개념입니다. 이는 객체의 내부 상태를 보호하고, 외부에서는 해당 객체의 공개된 메소드를 통해서만 상태를 변경할 수 있도록 하는 것을 말합니다. 이렇게 함으로써 객체의 내부 구현이 외부에 영향을 미치지 않도록 하며, 이는 유지보수와 확장성을 증진시킵니다.
더보기
캡슐화 예시 코드
정보 은닉은 객체의 세부 구현 내용을 외부로부터 숨기는 개념입니다. 이는 객체의 내부 상태를 보호하고, 외부에서는 해당 객체의 공개된 메소드를 통해서만 상태를 변경할 수 있도록 하는 것을 말합니다. 이렇게 함으로써 객체의 내부 구현이 외부에 영향을 미치지 않도록 하며, 이는 유지보수와 확장성을 증진시킵니다.
예시: Java에서는 private, protected, public 같
public class Account {
private double balance; // 비공개 필드
public Account(double balance) {
this.balance = balance;
}
// 공개 메소드를 통해 필드에 접근
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if (amount > 0 && balance >= amount) {
balance -= amount;
}
}
}
public class Main {
public static void main(String[] args) {
Account myAccount = new Account(1000);
myAccount.deposit(500);
myAccount.withdraw(200);
System.out.println("Current balance: " + myAccount.getBalance());
}
}
- 다형성(Polymorphism): 같은 이름의 메소드가 다른 클래스에서 다른 동작을 할 수 있게 합니다.
- 오버라이딩 (Overriding): 오버라이딩은 상속받은 클래스에서 상위 클래스의 메소드를 재정의하는 것을 의미합니다. 이를 통해 서브 클래스는 상위 클래스의 메소드와 같은 이름, 반환 타입, 파라미터를 가지지만, 다른 동작을 수행할 수 있습니다. 이는 다형성을 실현하는 데 중요한 역할을 합니다.
- 오버로딩 (Overloading): 오버로딩은 같은 클래스 내에서 같은 이름의 메소드를 여러 개 정의하지만, 메소드의 매개변수 유형이나 개수가 다른 것을 의미합니다. 이를 통해 같은 기능을 하는 메소드라도 다른 타입의 데이터에 대해 작동할 수 있도록 합니다.
더보기
다형성 예시 코드
class Animal {
public void sound() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Woof");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog();
myAnimal.sound(); // 출력: Woof
}
}
- 추상화(Abstraction): 복잡한 내용을 간단한 인터페이스로 표현하는 것입니다.
더보기
추상화 예시 코드
abstract class Shape {
abstract double area();
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
double area() {
return Math.PI * radius * radius;
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
System.out.println("Area: " + circle.area());
}
}
강점은 뭐야?
- 재사용성: 일단 정의된 클래스는 여러 객체를 만드는 데 재사용될 수 있습니다.
- 유지보수성: 프로그램을 모듈화하여 각 부분을 독립적으로 수정하거나 개선할 수 있습니다.
- 확장성: 새로운 클래스를 기존 클래스로부터 파생시켜 쉽게 확장할 수 있습니다.
- 추상화를 통한 복잡성 관리: 프로그램의 복잡한 내용을 간단한 인터페이스 뒤에 숨겨 사용자에게는 간단하게 보이게 할 수 있습니다
단점은 뭐야?
- 성능: 객체 생성, 메모리 사용 등에서 절차 지향 프로그래밍에 비해 느릴 수 있습니다.
- 복잡성: 클래스 설계, 객체 설계, 구조 설계 등 설계단계부터 많은 시간이 소모될 수 있습니다.
- 학습 곡선: 객체지향 프로그래밍의 개념들을 처음 배우는 데 시간이 걸릴 수 있습니다.
OOP언어는 뭐가있어?
- Java: Java는 가장 널리 알려진 객체지향 프로그래밍 언어 중 하나입니다. Java는 이식성이 높고, 네트워크와 분산 환경에서 강력하며, 가비지 컬렉션과 같은 메모리 관리 기능을 제공합니다. 객체지향의 특징으로 인해 재사용성, 유지보수성, 모듈성이 뛰어납니다.
- C++: C++은 객체지향 기능을 갖춘 강력한 시스템 프로그래밍 언어입니다. C++는 하드웨어에 가까운 프로그래밍이 가능하며, 성능이 중요한 애플리케이션에서 많이 사용됩니다.
- Python: Python은 객체지향 프로그래밍을 지원하는 동시에 매우 직관적이고 이해하기 쉬운 문법을 제공합니다. 다양한 라이브러리와 프레임워크를 통해 웹 개발, 데이터 과학, 인공지능 등 다양한 분야에서 사용됩니다.
그래서 어디에 사용해?
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발의 다양한 영역에서 널리 사용됩니다. 그 이유는 객체지향 프로그래밍이 제공하는 모듈성, 재사용성, 유지보수의 용이성, 그리고 설계의 직관성 때문입니다.
- 웹 애플리케이션 개발: 객체지향 프로그래밍은 웹 애플리케이션의 개발에 널리 사용됩니다. Java, Python, Ruby와 같은 언어들은 웹 서버, 사용자 인터페이스, 데이터베이스와의 상호작용 등을 다루는데 객체지향 접근 방식을 채택하고 있습니다
더보기
버튼과 사용자 인터페이스 요소 예시
public class Button {
private String label;
private String color;
public Button(String label, String color) {
this.label = label;
this.color = color;
}
public void onClick() {
// 클릭 이벤트 처리 로직
System.out.println(label + " button clicked");
}
// 게터와 세터 메소드
}
더보기
상태 관리 예시
public class User {
private String username;
private boolean isLoggedIn;
public User(String username) {
this.username = username;
this.isLoggedIn = false;
}
public void logIn() {
isLoggedIn = true;
// 로그인 처리 로직
}
public void logOut() {
isLoggedIn = false;
// 로그아웃 처리 로직
}
// 게터와 세터 메소드
}
- 게임 개발: 게임 개발에서 객체지향 프로그래밍은 게임 캐릭터, 레벨, 아이템 등을 객체로 모델링하는데 이상적입니다. 이런 접근 방식은 게임의 복잡한 로직과 상호작용을 관리하기에 효과적입니다.
더보기
캐릭터 클래스 예시
public class Character {
private String name;
private int health;
private int attackPower;
public Character(String name, int health, int attackPower) {
this.name = name;
this.health = health;
this.attackPower = attackPower;
}
public void attack(Character target) {
target.health -= this.attackPower;
System.out.println(this.name + " attacks " + target.name);
}
// 기타 메소드 (이동, 방어, 회복 등)
}
'Knowledge > Java' 카테고리의 다른 글
[JAVA] Java 11과 17에 대하여 (1) | 2024.03.13 |
---|---|
[JAVA] BigInteger 사용법: 하노이탑 문제 (1) | 2024.01.25 |
[백준] 1931번: 회의실 배정 JAVA 코드, Greedy (0) | 2023.12.01 |
[백준] 2583번: 영역 구하기 JAVA 코드, DFS (0) | 2023.11.29 |
[Java] Stream 중간연산 map에 대하여 (1) | 2023.11.01 |