기본 미션 : p. 330 문제 5번 실행 결과 인증 화면 캡처하기
객체란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것을 말한다.
- 집합 관계
집합 관계에 있는 객체는 하나는 부품이고 하나는 완성품에 해당
- 사용 관계
객체간의 상호작용
- 상속 관계
상위 객체를 기반으로 하위객체 생성
클래스 변수;
변수 = new 클래스;
또는
클래수 변수 = new 클래스;
로 나타낼 수 있다
package sec01.exam01;
public class StudentExample {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
(s1과 s2가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체이다.)
필드란?
객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.
필드 선언은 클래스 중괄호 {} 블록 어디서든 사용 가능하다.
타입 필드 [ = 초기값 ];
String company = "현대자동차";
String model = "그랜저";
int maxSpeed = 300;
을 옳은 예시로 들 수 있다.
만약 Car 클래스의 speed 필드값을 사용하려면 Car 객체를 우선 생성한 뒤 도트 연산자를 사용하여 speed 필드에 접근할 수 있도록 해야한다.
Car myCar = new Car ();
myCar.speed = 60;
Car 클래스 필드 선언
package sec02.exam01;
public class Car {
//필드
String company = "현대자동차";
String model = "그랜저";
String color = "검정";
int maxSpeed = 350;
int speed;
}
외부 클래스에서 Car 필드값 읽기와 변경
package sec02.exam01;
public class CarExample {
public static void main(String[] args) {
//객체 생성
Car myCar = new Car();
//필드 값 읽기
System.out.println("제작회사: " + myCar.company);
System.out.println("모델명: " + myCar.model);
System.out.println("색깔: " + myCar.color);
System.out.println("최고속도: " + myCar.maxSpeed);
System.out.println("현재속도: " + myCar.speed);
//필드 값 변경
myCar.speed = 60;
System.out.println("수정된 속도: " + myCar.speed);
}
}
생성자는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
클래스 ( 매개변수 선언, ```) {
}
생성자 선언 예시
package sec03.exam01;
public class Car {
//생성자
Car(String color, int cc) {
}
}
생성자 오버로딩이란?
매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.
public class 클래스 {
클래스 ( [ 타입 매개변수, ``` ] ) {
```
}
클래스 ( [ 타입 매개변수, ``` ] ) {
```
}
}
생성자 오버로딩 예
package sec03.exam03;
public class Car {
//필드
String company = "현대자동차";
String model;
String color;
int maxSpeed;
//생성자
Car() {
}
Car(String model) {
this.model = model;
}
Car(String model, String color) {
this.model = model;
this.color = color;
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
생성자 오버로딩이 많아진다면 생성자 간의 중복된 코드가 발생할 수 있다.
생성자에서 다른 생성자를 호출할 때에는 this() 코드를 사용한다.
클래스 ( [ 매개변수 , ``` ] ) {
this ( 매개변수, ``` , 값, ``` );
실행문;
}
this()는 반드시 생성자의 첫줄에서만 허용된다.
메소드에서 매개 변수가 필요한 경우가 있고 없는 경우가 있음
매개 변수가 있는 divide() 메소드의 선언 예
double divide(int x, int y) {```}
잘못된 매개값 사용 예
double result divide (10.5, 20.0)
// 10.5와 20.0은 double값이므로 int 타입으로 변환이 불가하다.
매개변수의 개수를 모르는 경우
매개 변수를 배열 타입으로 선언한다
int sum1(int[] values) { }
// sum1() 메소드를 호출할 때 배열을 넘겨줌으로써 배열의 항목값들을 모두 전달할 수 있다.
메소드선언에 리턴 타입이있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야 한다.
만약 return문이 없다면 컴파일 에러가 발생하고, return문이 실행되면 메소드는 즉시 종료된다.
return 리턴값;
리턴값이 없는 메소드: void
리턴값을 지정하는 것이 아닌 메소드 실행을 강제 종료하는 역할을 함
return;
package 상위패키지.하위패키지;
import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;
자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지를 정하고, 선택된 부모 클래스는 extends 뒤에 기술
class 자식클래스 extends 부모클래스 {
//필드
//생성자
//메소드
}
자식 객체를 생성하면 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성된다.
메소드 재정의란?
어떤 메소드가 자식클래스가 사용하기 적합하지 않다면 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야 하는데 이 경우 사용하게 된다.
자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super키워드를 붙여서 부모 메소드 호출 가능
super.부모메소드();
클래스를 선언할 때 final 키워드를 class 앞에 붙이면 이 클래스는 상속할 수 없는 클래스가 된다.
public final class 클래스 {```}
메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 재정의 할 수 없는 메소드가 된다.
public final 리턴타입 메소드 ( [ 매개변수, ``` ] ) {```}
자동 타입 변환이란?
프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환이 일어나는 조건
부모 타입 변수 = 자식타입;
package sec02.exam01;
public class PromotionExample {
public static void main(String[] args) {
B b = new B();
C c = new C();
D d = new D();
E e = new E();
A a1 = b;
A a2 = c;
A a3 = d;
A a4 = e;
B b1 = d;
C c1 = e;
//B b3 = e;
//C c2 = d; <-- 상속 관계에 있지 않아 컴파일 에러 발생
}
}
강제 타입 변환이란?
부모 타입을 자식 타입으로 변환하는 것을 말한다.
자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환 사용 가능
자식 타입 변수 = (자식 타입) 부모 타입;
package sec02.exam05;
public class ChildExample {
public static void main(String[] args) {
Parent parent = new Child();
parent.field1 = "data1";
parent.method1();
parent.method2();
/*
parent.field2 = "data2"; //(불가능)
parent.method3(); //(불가능)
*/
Child child = (Child) parent;
child.field2 = "yyy"; //(가능)
child.method3(); //(가능)
}
}
추상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙여야 한다.
public abstract class 클래스 {
//필드
//생성자
//메소드
}
다형성 : 상속돠 인터페이스는 개념상의 차이는 있지만, 모두 재정의와 타입 변환 기능을 제공한다.
static 키워드 없이 중첩 선언된 클래스
인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언 가능하고 정적 필드와 메소드는 선언 불가
모든 종류의 필드와 메소드 선언 가능
접근 제한자 및 static을 붙일 수 없음 (로컬 클래스는 메소드 내부에서만 실행되기 때문에 접근을 제한할 필요가 없음)
클래스의 멤버로 선언된 인터페이스
class A {
[static] interface {
void method();
}
}
자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우
부모 클래스 [필드 : 변수] = new 부모클래스 (매개값, ```) {
// 필드
// 메소드
};
구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우
인터페이스 [필드 : 변수] = new 인터페이스 () {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
// 필드
// 메소드
};
3주차는 미루지 않고 꾸준히 하길..!!
조금씩 미루게 되네요..ㅎㅎㅠㅠ