일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 계층형
- 자바
- 스파르타사전캠프
- 사전캠프
- 프레임워크
- 깃
- 스프링부트
- jvm
- springboot
- optional
- 스터디카페
- 도메인별
- 스파르타코딩클럽
- Framework
- 캡슐화
- 요시
- 메모리구조
- 내일배움캠프
- 키오스크
- 레퍼클래스
- 스파르타코딩클럽 #사전캠프
- 함바그
- Til
- 패키지구조
- 깃헙
- til #데이터베이스 #sql
- static
- 스파르타코딩클럽 #개발자 #백엔드
- Java
- Spring
- Today
- Total
John's Code Journey
[TIL] 250225 본문
오늘은 7일차 자바 2주차 강의를 수강했다.
2-1 숙제
💬 Q1. 자동차 클래스를 상상해서 만들어 보고 활용해 보세요.
요구사항
- Car 클래스를 만든다.
- 속성 - 자동차의 속성을 저장할 변수를 만든다.
- 생성자 - 조립할 속성을 골라 객체화를 시켜주세요.
- 기능 - 다양한 기능을 만들어보고 활용해보세요. → drive() 주행 기능 → accelerate() 가속 기능
package chapter2.method;
public class Car {
String brand;
String model;
String color;
int price;
public Car(String brand, String model, String color, int price) {
this.brand = brand;
this.model = model;
this.color = color;
this.price = price;
}
void turnOn() {
System.out.println(model+ "시동을 켭니다.");
}
void drive() {
System.out.println("출발합니다.");
}
void accelerate() {
System.out.println("가속합니다.");
}
void stop() {
System.out.println("정지합니다.");
}
void turnOff() {
System.out.println(model + " 시동을 끕니다.");
}
void carInfo() {
System.out.println("브랜드: " + brand);
System.out.println("모델: " + model);
System.out.println("색상: " + color);
System.out.println("가격: " + price + " 억원");
}
}
package chapter2.method;
public class CarMain {
public static void main(String[] args) {
Car car = new Car("포르쉐", "카이엔", "블랙", 2);
car.carInfo();
car.turnOn();
car.drive();
car.accelerate();
car.stop();
car.turnOff();
}
}
2-6 인터페이스 실습 과제
💬 Q1. 다양한 가전제품을 일관된 방식으로 조작할 수 있는 인터페이스를 설계하세요.
💡 요구사항
- 가전제품 종류: Tv, 에어컨, 컴퓨터
- turnOn(); → 기기를 켜는 기능
- turnOff(); → 기기를 끄는 기능
- 각 가전제품의 기능을 확장해보세요.
package chapter2.interfaceexample.prac;
public interface Homeappliances {
void turnOn();
void turnOff();
}
package chapter2.interfaceexample.prac;
public class Tv implements Homeappliances {
@Override
public void turnOn() {
System.out.println("Tv turned on");
}
@Override
public void turnOff() {
System.out.println("Tv turned off");
}
void changeChannel(int channel) {
System.out.println("Tv changed to " + channel);
}
}
package chapter2.interfaceexample.prac;
public class Aircon implements Homeappliances{
@Override
public void turnOn() {
System.out.println("Turning on aircon");
}
@Override
public void turnOff() {
System.out.println("Turning off aircon");
}
void setDegree(int degree) {
System.out.println("Setting degree to "+degree);
}
}
package chapter2.interfaceexample.prac;
public class Computer implements Homeappliances{
@Override
public void turnOn() {
System.out.println("Turning on Computer");
}
@Override
public void turnOff() {
System.out.println("Turning off Computer");
}
void startJava() {
System.out.println("Starting Java");
}
}
package chapter2.interfaceexample.prac;
public class Main {
public static void main(String[] args) {
//객체 생성
Tv tv = new Tv();
Aircon aircon = new Aircon();
Computer computer = new Computer();
// 전원 켜기
tv.turnOn();
aircon.turnOn();
computer.turnOn();
// 기능 사용
tv.changeChannel(10);
aircon.setDegree(25);
computer.startJava();
// 전원 끄기
tv.turnOff();
aircon.turnOff();
computer.turnOff();
}
}
접근제어자
1. public 멤버 : public 은 '공개'를 나타내며, 모든 클래스에서 접근이 가능합니다 (패키지와 상관없음)
2. private 멤버 : private은 '비공개'를 나타내며, 같은 클래스안에 있는 멤버들만 접근이 가능
해당 클래스에서만 접근 가능하므로 하위 클래스에서 보이지 않음(메소드 오버라이딩)
3. protected 멤버 : 같은 패키지안의 모든 클래스와, 다른 패키지의 자식 클래스에서 접근이 가능 (상속 관계의 호출은 허용한다.)
4. default(생략가능) 멤버 : 접근지정자가 없으면 default 로, 같은 패키지안의 클래스에서만 접근이 가능
private -> default -> protected -> public
순서대로 private 가 가장 많이 차단하고 public 이 가장 많이 허용한다.
상속 관계
이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받는 것이다. 상속을 사용하려면 extends 키워드를 사용하면 된다. 그리고 extends대상은 하나만 선택할 수 있다.
용어 정리
부모 클래스 (슈퍼 클래스): 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
자식 클래스 (서브 클래스): 부모 클래스로 부터 필드와 메서드를 상속받는 클래스
상속과 메모리 구조
상속이라고 해서 단순하게 부모의 필드와 메서드만 물려 받는게 아니다. 상속 관계를 사용하면 부모 클래스도 함께 포함해서 생성된다. 외부에서 볼때는 하나의 인스턴스를 생성하는 것 같지만 내부에서는 부모와 자식이 모두 생성되고 공간도 구분된다.
********************************************************
상속 관계의 객체를 생성하면 그 내부에는 부모와 자식이 모두 생성된다.
상속 관계의 객체를 호출할 때, 대상 타입을 정해야 한다. 이때 호출자의 타입을 통해 대상 타입을 찾는다.
현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다. 기능을 찾지 못하면 컴파일 오류가 발생한다.
********************************************************
상속과 메서드 오버라이딩
부모에게서 상속 받은 기능(메서드)을 자식이 재정의 하는 것을 메서드 오버라이딩(Overriding)이라 한다.
오버로딩(Overloading)과 오버라이딩(Overriding)
메서드 오버로딩:
메서드 이름이 같고 매개변수(파라미터)가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩(Overloading)이라 한다. 오버로딩은 번역하면 과적인데, 과하게 물건을 담았다는 뜻이다. 따라서 같은 이름의 메서드를 여러개 정의했다고 이해하면 된다.
메서드 오버라이딩:
메서드 오버라이딩은 하위 클래스에서 상위 클래스의 메서드를 재정의하는 과정을 의미한다. 따라서 상속 관계에서 사용한다. 부모의 기능을 자식이 다시 정의하는 것이다.
오버라이딩의 특징
1. 메서드 이름, 반환 타입, 매개변수는 부모 클래스의 메서드와 동일해야 합니다.
2. 접근 제어자는 부모 클래스에서 정의된 것보다 더 제한적일 수 없습니다. 예를 들어, 부모 클래스의 메서드가 public이라면 자식 클래스에서도 public이어야 하며, private나 protected로 변경할 수 없습니다.
3. 상속 관계에서만 이루어집니다. 즉, 자식 클래스가 부모 클래스의 메서드를 재정의하는 것입니다.
오버로딩 Overloading Ex
public class Calculator {
// 첫 번째 오버로딩: 두 개의 정수 덧셈
public int add(int a, int b) {
return a + b;
}
// 두 번째 오버로딩: 세 개의 정수 덧셈
public int add(int a, int b, int c) {
return a + b + c;
}
// 세 번째 오버로딩: 두 개의 실수 덧셈
public double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println("두 정수의 덧셈: " + calc.add(3, 5));
// 출력: 8
System.out.println("세 정수의 덧셈: " + calc.add(1, 2, 3));
// 출력: 6
System.out.println("두 실수의 덧셈: " + calc.add(2.5, 3.7));
// 출력: 6.2
}
}
메서드 오버로딩을 활용하면, 같은 이름의 메서드를 다양한 방식으로 사용하여 코드의 가독성을 높이고, 중복을 줄일 수 있다 !!!!
Overriding Ex
// 부모 클래스
class Animal {
// 부모 클래스에서 정의한 메서드
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스
class Dog extends Animal {
// 부모 클래스의 sound 메서드를 오버라이딩
@Override
public void sound() {
System.out.println("개가 멍멍 소리를 냅니다.");
}
}
class Cat extends Animal {
// 부모 클래스의 sound 메서드를 오버라이딩
@Override
public void sound() {
System.out.println("고양이가 야옹 소리를 냅니다.");
}
}
public class Main {
public static void main(String[] args) {
// 부모 클래스 타입의 변수로 자식 클래스 객체를 생성
//부모 변수가 자식 인스턴스 참조(다형적 참조)!!!!!!!!!!!!
Animal myDog = new Dog();
Animal myCat = new Cat();
// 각 객체에서 오버라이딩된 메서드 호출
myDog.sound(); // 출력: 개가 멍멍 소리를 냅니다.
myCat.sound(); // 출력: 고양이가 야옹 소리를 냅니다.
}
}
'Today I Learned > 스파르타 내일배움캠프' 카테고리의 다른 글
[TIL] 250305 계산기 과제 리뷰 (1) | 2025.03.05 |
---|---|
[TIL] 예외처리(Exception) (0) | 2025.02.26 |
[TIL] 250224 (1) | 2025.02.24 |
[TIL] 내일배움캠프 250221 (0) | 2025.02.21 |
[TIL] 내일배움캠프 250220 (0) | 2025.02.20 |