240123 자바 교육 day2

gununoo·2024년 1월 23일
2

Java

목록 보기
2/4
post-thumbnail

오버로딩 vs 오버라이딩

오버로딩은 같은 일을 하는 여러 버전의 메소드를 만드는 것이고, 오버라이딩은 상속받은 메소드를 새롭게 바꾸는 것

  • 오버로딩 예시
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)
    오버라이딩은 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 다시 정의하는 것을 말합니다.
    하위 클래스에서 상위 클래스의 메소드를 재정의함으로써, 동일한 메소드 호출에 대해 다른 동작을 수행하도록 할 수 있습니다.
    오버라이딩된 메소드는 매개변수의 타입과 개수가 상위 클래스의 메소드와 완전히 동일해야 합니다.

다형성

  • Car.java
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);
	}	
}
  • Taxi.java
package poly;

public class Taxi extends Car { // Is-A 방식
	@Override
	public void speedUp() {
		speed += 2; 
		System.out.println("현재속도: " + speed);
	}
}
  • Bus.java
package poly;

public class Bus extends Car { // Is-A 방식
	public void stop() {
		speed = 0;
		System.out.println("정류장 정차"); 
	}
}
  • CarMainTest.java
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(); 
	}
}
  • 결과

업캐스팅, 다운캐스팅

  • CarMainTest.java
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());
    }
}
  • 해결: Product 클래스에 생성자 추가
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;
	}
}
  • Tv 클래스는 보너스점수가 가격의 20%로 되도록 TV 클래스를 변경해보시오.
class Tv extends Product {
    Tv() {
        bonusPoint = (int)(price * 0.2); // TV의 보너스 포인트는 가격의 20%
    }

    public String toString() {
        return "Tv";
    }
}

Abstract, Override

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)을 사용하면서도 각기 다른 동작을 수행합니다.


인터페이스

  • CarIF.java
package inter;

public interface CarIF {
	String KM = '킬로미터';
	void speedUp();
	void speedDown();
	void stop();
}
  • SmartCar.java
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
		
	}

}
  • CarMainTest2.java
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();
		
	}
}
  • 결과

다양한 api

String

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
	}
}

Date, Calendar

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와 같은지? 
	}
}
  • 결과

Random

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 + " ");
        }
    }
}
  • 결과
profile
take a look

2개의 댓글

comment-user-thumbnail
2024년 1월 23일

오늘도 놀러왔어요 ^_^

1개의 답글