[ 3주차 - 0825 ]
금일 커리큘럼
├ 09:00 ~ 12:00 자바 프로그래밍 기초 (상속, getter & setter)
└ 13:00 ~ 18:00 자바 프로그래밍 기초 (메서드 오버라이딩 & 오버로딩, 다형성)
2. 상속 (inheritance)
부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것 (일반화와 확장 개념 합침)
- 부모 자식간
is-a,kind-of로 관계를 표현함. - 코드
재사용및확장성에 용이하다.
기본 예시
class Parent { // extends 없어도 컴파일시 extends Object 최상위 부모로 상속됨.
int a = 10;
int b = 0;
int c = 5;
}
class Child extends Parent {
// 부모에 상속되어 필드변수 같이 사용됨
// 필드의 오버라이드
int b = 1;
public Child() {
this.a = 20; // 생성자에서 부모 필드 받아 자기 자신 변경 가능
}
}
public class Exam {
public static void main(String[] args) {
Parent p = new Parent();
Child c = new Child();
System.out.println(p.a); // 10 (부모필드)
System.out.println(c.a); // 20 (자식 this)
System.out.println(c.c); // 5 (자식인데 부모필드 가져옴)
// 1. 부모는 자식을 가리킬 수 있음.
Parent p1 = new Child();
// Child c1 = new Parent(); // 불가능!
// 2. 필드는 선언한 타입에 따름.
System.out.println(p1.b); // 0 (부모필드)
System.out.println(c.b); // 1 (자식필드)
System.out.println(p1.a); // 20 (자식 this)
// 묵시적 형변환
Parent p2 = new Child();
Object obj2 = p2;
System.out.println(((Parent)obj2).b); // 0 (부모필드)
System.out.println(((Child)obj2).b); // 1 (자식필드)
if(obj2 instanceof Child) {
System.out.println("obj2는 Child 타입입니다.");
}
// 명시적 형변환
Child c2 = (Child)obj2;
System.out.println(c2.b); // 1 (자식필드)
}
}
TIP
상속관계 흐름 : object > parent > child
Child c1 = new Parent();가 불가능한 이유
- 자식(Child)은 부모(Parent)의 모든 필드와 메서드를 가지지만,
부모는 자식의 추가된 필드/메서드를 모르기 때문에
부모 객체를 자식 타입으로 변환하면 런타임 오류(컴파일 에러)가 발생함.
패키지 다른 경우 예시
// 부모 클래스 (다른 패키지)
// package 경로A;
public class Animal {
protected String name;
protected int age;
// 자식 상속에선 super()로 접근
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void info() {
System.out.println("동물이름: " + name);
System.out.println("동물나이: " + age);
}
public void speak() {
System.out.println("-".repeat(5));
System.out.println("동물이 소리를 낸다");
}
}
// 자식 클래스와 사용 예시 (현재 패키지)
// package 경로B;
// import 경로A.Animal;
class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age); // super() : 부모 생성자 호출
this.breed = breed;
}
public void showBreed() {
System.out.println("견종: " + breed);
}
@Override
public void speak() {
super.speak(); // super.메서드명() : 부모 메서드 호출
System.out.println("크르릉");
}
}
public class AnimalExam {
public static void main(String[] args) {
Dog dog = new Dog("초코", 3, "슈나우저");
dog.info(); // 부모 메서드 사용
dog.showBreed(); // 자식 메서드 사용
}
}
# 실행 결과
동물이름: 초코
동물나이: 15
견종: 슈나우저
super & super() 설명
super: 부모 클래스의 멤버에 접근super(): 부모 클래스의 생성자 호출- 명시하지 않으면 자동으로
super()호출 - 모든 생성자는 첫 줄에
super()또는this()를 호출해야 함
- 명시하지 않으면 자동으로
3. getter, setter 메서드
private필드를 외부에서 읽거나 변경할 때 사용하는 메서드.- 캡슐화(정보 은닉)를 위해 사용.
- 명칭은
get필드명,set필드명으로 정의하여 사용하는 것을 권장. (컨벤션)
class Person {
private String name; // private 필드
// getter: 값 읽기
public String getName() {
return name;
}
// setter: 값 변경
public void setName(String name) {
this.name = name;
}
}
public class Exam {
public static void main(String[] args) {
Person p = new Person();
p.setName("홍길동"); // 변경
System.out.println(p.getName()); // 읽기
}
}
4. 메서드 오버라이딩
오버라이딩(Overriding)
- 부모 클래스에서 정의한 메서드 -> 자식 클래스에서 재정의함
메서드 이름,매개변수,반환타입모두 동일해야 함- 오버라이딩 사용시
@Override어노테이션 사용 권장
class Animal {
public void sound() {
System.out.println("동물이 소리를 낸다");
}
}
class Dog extends Animal {
// 자식클래스에서 sound 재정의 됨
@Override
public void sound() {
System.out.println("멍멍!");
}
}
public class Exam {
public static void main(String[] args) {
// 사용 예시
Animal a = new Dog();
a.sound();
}
}
# 실행 결과
멍멍!
5. 메서드 오버로딩
- 오버로딩(Overloading)
같은 이름의 메서드를 매개변수의 타입/개수만 다르게 여러 개 정의함.
class Calc {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
}
// 사용 예시
Calc calc = new Calc();
calc.add(1, 2); // int 버전
calc.add(1.5, 2.5); // double 버전
calc.add(1, 2, 3); // 3개 int 버전
6. 다형성
특정 속성을 가지고서 여러가지 형태로 나타내는 성질
부모 타입으로 자식 타입을 참조
- 하나의 타입으로 여러 종류의 객체를 다루는 것
- 부모 타입의 참조 변수로 자식 객체를 참조
- 메소드 오버라이딩과 함께 사용
- 오버라이딩된 메서드를 통해 객체마다 다른 동작을 할 수 있음.
class Animal {
public void sound() {
System.out.println("동물이 소리를 낸다");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹~");
}
}
public class Exam {
public static void main(String[] args) {
Animal a0 = new Animal();
Animal a1 = new Dog(); // 부모 타입 변수로 자식 객체 참조
Animal a2 = new Cat();
a0.sound(); // 동물이 소리를 낸다
a1.sound(); // 멍멍!
a2.sound(); // 야옹~
}
}
etc.
자바에서 클라이언트의 요청을 받아서 응답하는 기술은?
서블릿 (Servlet)
- 자바 웹 개발의 가장 근간을 이루는 기술.
- 모든 자바 웹 프레임워크는 내부적으로 서블릿을 기반으로 동작한다.
- 자바로 만들어진 웹 서버의 부품으로, 클라이언트(웹 브라우저)의 요청(Request)을 받고, 그에 맞는 작업(비즈니스 로직)을 수행한 뒤, 응답(Response)을 생성하는 핵심 역할을 함.
- 비유하자면, 주문을 받고 요리를 완성하는 주방장과 같다.
매개변수 객체 타입
class Parent {/* ... */}
class Child extends Parent {/* ... */}
public class Exam {
public static void test0(Child child) {/* ... */}
public static void test1(Object obj) {/* ... */}
public static void main(String[] args) {
Parent p1 = new Parent();
Object p2 = new Parent();
Parent c1 = new Child();
Child c2 = new Child();
Object c3 = new Child();
test0(c2); // 가능
// test0(c1); // 불가능 (Child 타입 이여야함)
// 오브젝트는 최상위 상속으로 오브젝트타입은 다 가능
test1(p1);
test1(p2);
test1(c1);
test1(c2);
test1(c3);
}
}
멋사 부트캠프 개인학습 git : https://github.com/star1431/backend
'멋사 - 부트캠프 19기 : Java > Java' 카테고리의 다른 글
| (08.27) java 기초 - 오브젝트 Override, final과 열거형, 내부클래스, String 클래스, 스트링빌더&버퍼, Math (2) | 2025.08.27 |
|---|---|
| (08.26) java 기초 - 객체형변환, 추상클래스, 인터페이스, 디자인패턴, 오브젝트 (4) | 2025.08.26 |
| (08.22) java 기초 - 생성자, this, 메서드체이닝, 패키지, static (2) | 2025.08.25 |
| (08.21) java 기초 - 다차원배열, 객체지향, 클래스, 필드, 메서드 (1) | 2025.08.25 |
| (08.20) java 기초 - 반복문(while & for) , 배열 (1) | 2025.08.25 |