오버로딩은 같은 일을 하는 여러 버전의 메소드를 만드는 것이고, 오버라이딩은 상속받은 메소드를 새롭게 바꾸는 것
class Calculator {
// 두 정수의 덧셈
int add(int a, int b) {
return a + b;
}
// 세 정수의 덧셈
int add(int a, int b, int c) {
return a + b + c;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3)); // 5
System.out.println(calc.add(2, 3, 4)); // 9
}
}
오버로딩은 같은 이름의 메소드를 여러 개 만들되, 매개변수를 다르게 하는 것입니다.
class Animal {
// 동물의 소리
void makeSound() {
System.out.println("동물 소리!");
}
}
class Dog extends Animal {
// 개의 소리 오버라이딩 🐶
@Override
void makeSound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
// 고양이의 소리 오버라이딩 😸
@Override
void makeSound() {
System.out.println("이야오옹~");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Dog dog = new Dog();
Cat cat = new Cat();
animal.makeSound(); // "동물 소리!"
dog.makeSound(); // "멍멍!" 🐶
cat.makeSound(); // "이야오옹~" 😸
}
}
오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 재정의하는 것입니다. 예를 들어, '동물 소리' 기능을 가진 메소드를 각 동물에 맞게 오버라이딩할 수 있습니다.
오버로딩 (Overloading)
오버로딩은 같은 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것을 의미합니다.
이때, 메소드 이름은 같지만 매개변수의 타입이나 개수가 달라야 합니다.
오버로딩을 통해 다양한 매개변수에 대응하는 메소드를 하나의 이름으로 관리할 수 있어 코드의 가독성과 재사용성을 높일 수 있습니다.
오버라이딩 (Overriding)
오버라이딩은 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 다시 정의하는 것을 말합니다.
하위 클래스에서 상위 클래스의 메소드를 재정의함으로써, 동일한 메소드 호출에 대해 다른 동작을 수행하도록 할 수 있습니다.
오버라이딩된 메소드는 매개변수의 타입과 개수가 상위 클래스의 메소드와 완전히 동일해야 합니다.
package poly;
public class Car {
protected int speed; // 다른 클래스(Bus, Taxi)가 상속받아야 하므로 protected
public static final String TESLA = "테슬라";
// 바뀌지 않는 변수는 final.
// 상수변수는 일반적으로 public으로 하여 다른 클래스에서 접근 가능함.
// 상수변수는 대문자로 표기함.
// static을 사용하면 메모리 관리에 효율적임(같은 클래스의 모든 인스턴스 간에 데이터를 공유)
public Car() { // 객체를 초기화하는 생성자
super(); // 상위 클래스 생성자를 호출
// TODO Auto-generated constructor stub
speed = 0;
}
public void speedUp() { // 매개변수는 없으니까 void
speed++;
System.out.println("현재속도: " + speed);
}
}
package poly;
public class Taxi extends Car { // Is-A 방식
@Override
public void speedUp() {
speed += 2;
System.out.println("현재속도: " + speed);
}
}
package poly;
public class Bus extends Car { // Is-A 방식
public void stop() {
speed = 0;
System.out.println("정류장 정차");
}
}
package view;
import poly.Bus;
import poly.Taxi;
public class CarMainTest {
public static void main(String[] args) {
Bus bus = new Bus(); // Has-A 방식
Taxi taxi = new Taxi();
bus.speedUp();
taxi.speedUp();
}
}
package view;
import poly.Car;
import poly.Bus;
import poly.Taxi;
public class CarMainTest {
public static void main(String[] args) {
Car[] car = new Car[2];
car[0] = new Bus(); // 업캐스팅
car[1] = new Taxi(); // 업캐스팅
for (int i=0; i < car.length; i++) {
car[i].speedUp();
}
((Bus)car[0]).stop(); // 다운캐스팅
}
}
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매시 제공하는 보너스점수
Product(int price) {
this.price = price;
bonusPoint = (int)(price / 10.0); // 기본적으로 10%
}
public int getBonusPoint() {
return bonusPoint;
}
public void setBonusPoint(int bonusPoint) {
this.bonusPoint = bonusPoint;
}
}
class Tv extends Product {
public String toString() {
return "Tv";
}
}
class TvMainTest {
public static void main(String[] args) {
Tv t = new Tv(1000); // Tv 객체 생성 시 가격을 전달
System.out.println(t);
System.out.println(t.getBonusPoint());
}
}
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매시 제공하는 보너스점수
public Product() {
super();
}
Product(int price) {
this.price = price;
bonusPoint = (int)(price / 10.0); // 기본적으로 10%
}
public int getBonusPoint() {
return bonusPoint;
}
public void setBonusPoint(int bonusPoint) {
this.bonusPoint = bonusPoint;
}
}
class Tv extends Product {
Tv() {
bonusPoint = (int)(price * 0.2); // TV의 보너스 포인트는 가격의 20%
}
public String toString() {
return "Tv";
}
}
package java_day02;
abstract class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매시 제공하는 보너스점수
public Product() {
super();
}
Product(int price) {
this.price = price;
bonusPoint = 0;
}
public abstract int calcBonusPoint(int price);
public int getBonusPoint() {
return bonusPoint;
}
public void setBonusPoint(int price) {
this.bonusPoint = calcBonusPoint(price);
}
}
class Tv extends Product {
Tv() {
}
public String toString() {
return "Tv";
}
@Override
public int calcBonusPoint(int price) {
// TODO Auto-generated method stub
bonusPoint = (int)(price * 0.2); // TV의 보너스 포인트는 가격의 20%
return bonusPoint;
}
}
class PC extends Product {
PC() {
}
public String toString() {
return "PC";
}
@Override
public int calcBonusPoint(int price) {
// TODO Auto-generated method stub
bonusPoint = (int)(price * 0.3); // PC의 보너스 포인트는 가격의 30%
return bonusPoint;
}
}
class TvMainTest {
public static void main(String[] args) {
Tv t = new Tv(); // Tv 객체 생성 시 가격을 전달
System.out.println(t);
System.out.println(t.getBonusPoint());
}
}
예제 코드에서, Product 클래스는 추상 클래스로 선언되어 있으며, calcBonusPoint는 추상 메서드로 정의되어 있습니다. 이 추상 메서드는 Tv와 PC 클래스에서 구현(오버라이드)되어 있습니다.
Tv와 PC 클래스는 Product 클래스의 calcBonusPoint 추상 메서드를 오버라이드하고 있습니다. 각각 Tv와 PC에 특화된 보너스 포인트 계산 방식을 구현함으로써, 같은 메서드 이름(calcBonusPoint)을 사용하면서도 각기 다른 동작을 수행합니다.
package inter;
public interface CarIF {
String KM = '킬로미터';
void speedUp();
void speedDown();
void stop();
}
package inter;
public class SmartCar implements CarIF {
@Override
public void speedUp() {
// TODO Auto-generated method stub
System.out.println("가속");
}
@Override
public void speedDown() {
// TODO Auto-generated method stub
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
}
package view;
import inter.CarIF;
import inter.SmartCar;
public class CarMainTest2 {
public static void main(String[] args) {
SmartCar e = new SmartCar();
CarIF sc = null;
if (e instanceof CarIF) { // e가 CarIF의 인스턴스이면
sc = e;
}
sc.speedUp();
}
}
package str;
public class StringTest {
public static void main(String[] args) {
String s = "user@naver.co#m";
String res = "";
s = s.trim().replace("#", "");
System.out.println(s); // 결과: user@naver.com
res = s.substring(0, s.indexOf("@"));
System.out.println(res); // 결과: user
res = s.substring(s.indexOf("@") + 1);
System.out.println(res); // 결과: naver.com
res = s.split("@")[1];
System.out.println(res); // 결과: naver.com
}
}
package str;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class StringTest {
public static void main(String[] args) throws Exception {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date)); // 현재 시각 출력
Date date1 = sdf.parse("2024-01-23 16:38:10");
Date date2 = sdf.parse("2024-01-24 16:38:10");
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
System.out.println(calendar1.after(calendar2)); // calendar1가 calendar2보다 뒤에(나중에) 있는지?
System.out.println(calendar1.before(calendar2)); // calendar1가 calendar2보다 앞에(먼저) 있는지?
System.out.println(calendar1.equals(calendar2)); // calendar1가 calendar2와 같은지?
}
}
import java.util.Random;
public class LottoGenerator {
public static void main(String[] args) {
Random random = new Random();
System.out.println("로또 번호:");
for (int i = 0; i < 6; i++) {
// 1부터 45 사이의 랜덤한 숫자를 생성
int number = random.nextInt(45) + 1;
System.out.print(number + " ");
}
}
}
오늘도 놀러왔어요 ^_^