일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- React #Web #프런트엔드
- SSAFY
- RPA
- BFS
- 자바스크립트
- 알고리즘
- 로보어드바이저
- Ai
- 모던자바스크립트
- algorithms
- frontend
- Python
- 스택
- 일임형
- 자문형
- 프로그래머스
- 신한투자증권
- JS
- algoritms
- BAEKJOON
- 큐
- dfs
- 파이썬
- 백준
- 자료구조
- JavaScript
- 혁신금융서비스
- Algorithm
- programmers
- pyhton
- Today
- Total
Step by Step
클래스와 객체, 다형성(2일차) 본문
클래스와 객체
package day02;
import java.lang.reflect.Method;
public class EX01 {
public static void main(String[] args) {
Animal dog = new Animal("강아지","멍멍");
Animal cow = new Animal("송아지","음메");
System.out.println(dog.name);
dog.cry();
cow.cry();
}
}
// 동물 클래스, 이름(String), 울음소리(method)
class Animal{
String name;
String sound;
Animal() {
}
Animal(String name){
this.name = name;
}
Animal(String name, String sound){
this.name = name;
this.sound = sound;
}
void cry(){
this.sound = sound;
System.out.println(sound);
}
}
클래스
- 서로 관련 되어 있는 메서드의 집합
- 객체들의 속성을 묶어 놓은 집합체
인스턴스
- OOP에서 어떤 클래스에 속하는 객체
- 클래스로부터 생성된 객체
클래스 구성 요소
- Field - 필드
- Method - 메소드
- Constructor - 생성자
생성자
생성자는 new 연산자를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메서드라고 생각하면 편하다.
생성자는 멤버 변수를 초기화하는 역할을 한다. 생성자를 만들지 않아도 객체 생성이 가능하다. 개발자가 직접 생성자를 선언하지 않을 때는 컴파일러가 자동으로 추가해준다. 생성자는 객체를 생성함과 동시에 객체를 초기화할 수 있다. 생성자를 통해 객체를 초기화 한다는 것은
필드와 메소드를 호출하는 등 객체를 사용하기 위해 객체를 메모리에 올린다는 의미를 가지고 있다.
즉 인스턴스 멤버의 데이터를 초기화할 수도 있다,,,,,!
class Student {
Student() {} // 매개변수가 없는 생성자
Studnet(String name, int number){} // 매개변수가 있는 생성자
}
생성자 오버로딩
자바는 생성자를 여러 개 선언하는 것을 허용한다.
상황에 따라 매개변수 없이 또는 1개, 2개 등 외부에서 제공할 수 있는 데이터만큼 매개변수로 전달하여 객체를 생성한다.
이렇게 생성자를 다양한 형태로 선언하는 것을 생성자 오버로딩이라고 한다.
필드
객체가 가져야할 데이터, 상태를 저장하는 변수
메소드
클래스 안에서 특정 기능을 수행하기 위해 코드들을 따로 하나의 블록으로 묶어 둔 집합
필요에 따라 이 집합을 호출하여 기능을 실행 가능.
다형성
객체 지향 프로그래밍의 대표적인 특징 중 하나로, 하나의 타입으로 다양한 객체를 사용할 수 있다.
- 상속
- 메소드 오버라이딩
- 클래스 타입변환
위 세가지 조합이 다형성을 극대화해준다.
오버로딩
자바는 매개변수의 자료형, 갯수, 순서를 기반으로 메소드를 구별한다.
하나의 클래스 안에서 같은 이름의 메소드를 여러개 구현하고 필요에 따라 메소드를 선택해 사용할 수 있다.
쉽게 말해서...!
이름은 같지만 시그니처(파라미터 수, 타입) 다른 메소드를 중복으로 선언하는 것을 의미한다.
- 메소드 이름이 같아야 한다.
- 리턴형이 같아도 되고 달라도 된다.
- 파라미터 개수가 달라야 한다 .
- 파라미터 개수가 같을 경우, 데이터타입이 달라야 한다.
// test() 호출
void test(){
System.out.println("매개변수 없음");
}
// test에 매개변수로 int형 2개 호출
void test(int a, int b){
System.out.println("매개변수 "+ a + "와 " + b);
}
// test에 매개변수 double형 1개 호출
void test(double d){
System.out.println("매개변수 " + d);
}
}
오버라이딩
부모 클래스에게 상속받은 메소드를 재정의하여 자식 클래스용 메소드를 구현하고
자식 객체를 통해 메소드를 호출할 땐 오버라이딩된 메소드가 호출된다.
쉽게 말해서....!
부모 클래스의 메소드의 동작 방법을 변경하여 우선적으로 사용하는 것이다.
- 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야 한다.
- 메소드 이름이 같아야 한다.
- 메소드 파라미터 개수, 파라미터의 자료형이 같아야 한다.
- 메소드 리턴형이 같아야 한다.
- 상위 메소드와 동일하거나 내용이 추가되어야 한다.
[ People.java ]
public class People {
public String name;
public int age;
public void print(){
System.out.println("이름은 "+this.name+ "이고, 나이는" + this.age+"입니다.");
}
}
[ Student.java ]
// People 상속
public class Student extends People {
String job;
// print() 메소드 오버라이딩
public void print(){
System.out.println("이름은 "+this.name + "이고, 나이는" + this.age + "입니다.");
//새롭게 추가된 부분
System.out.println(this.name+"은 "+this.job+" 입니다.");
}
}
package day02;
import java.util.Base64;
//Q 바리스타 춘식.
//chunsik.getCoffeeInfo() => 이 커피는 4500원입니다.
//chunsik.makeCoffee() => 커피 여기있습니다.
public class EX02 {
public static void main(String[] args) {
Coffee americano = new Coffee(4000,"hot","tall");
Coffee ediya = new Coffee(3000,"hot","grande");
ediya.setPrice(2000);
ediya.getInfo();
ediya.setPrice(5000);
ediya.getInfo();
Barista chunsik = new Barista("춘식");
chunsik.getCoffeeInfo(americano);
chunsik.makeCoffee();
}
}
// 커피 class
// field : price, hot or ice, size
// method : getInfo() - sout => price, temp, size
// 생성자로 변수 받는 이유
class Coffee{
// private 시용 시 중괄호 내에서만 사용가능 => 생성자 내에서 접근.
// 필드 => 생성자 => 메소드 순서대로 작성.
public int price;
private String temperature;
private String size;
// 생성자
Coffee(){
}
Coffee(int price, String temperature, String size){
this.price = price;
this.temperature = temperature;
this.size = size;
}
// field 값을 설정한다.
// 변경할 값을 검증하는 용도로 사용한다.
void setPrice(int price){
if (price >= this.price){
this.price = price;
}
}
// field 값을 불러온다.
int getPrice(int price){
return price;
}
void getInfo() {
System.out.println("이 커피의 가격은 "+price+" 온도는 "+temperature+" 사이즈는 "+size);
}
}
class Barista{
String name;
int price;
// 생성자
Barista(String name) {
this.name = name;
}
void makeCoffee(){
System.out.println("커피 여기 있습니다.");
}
void getCoffeeInfo(Coffee coffee){
System.out.println("이 커피는 "+ coffee.getPrice(coffee.price) +"원 입니다.");
}
}
출력 값 =>
이 커피의 가격은 3000 온도는 hot 사이즈는 grande
이 커피의 가격은 5000 온도는 hot 사이즈는 grande
이 커피는 4000원 입니다.
커피 여기 있습니다.
'Java' 카테고리의 다른 글
애자일 방법론 vs 폭포수 방법론 (0) | 2024.04.15 |
---|---|
내가 생각하는 객체 지향이란? (0) | 2024.04.11 |
인터페이스를 사용해야 하는 이유(Java 4일차) (0) | 2024.04.08 |
페어 프로그래밍(3일차) (0) | 2024.04.05 |
프로디지털아카데미 java(1일 차) (0) | 2024.04.03 |