[혼자 공부하는 자바] Chapter 06 ~ 09

혜원·2023년 7월 16일
1
post-thumbnail

기본 미션 : p. 330 문제 5번 실행 결과 인증 화면 캡처하기


06_1 객체 지향 프로그래밍

객체란?
물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것을 말한다.

객체 간의 관계

- 집합 관계
집합 관계에 있는 객체는 하나는 부품이고 하나는 완성품에 해당
- 사용 관계
객체간의 상호작용
- 상속 관계
상위 객체를 기반으로 하위객체 생성


식별자 작성 규칙

  • 하나 이상의 문자로 이루어져야 함
  • 첫 글자에는 숫자가 올 수 없음
  • $ , _ 이외의 특수 문자는 사용할 수 없음
  • 자바 키워드는 사용할 수 없음

객체 생성과 클래스 변수

클래스 변수;
변수 = 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 객체는 완전히 독립된 서로 다른 객체이다.)


06_2 필드

필드란?
객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.

필드 선언

필드 선언은 클래스 중괄호 {} 블록 어디서든 사용 가능하다.

타입 필드 [ =  초기값 ];
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 ( 매개변수, ``` , 값, ``` );
	실행문;
}

this()는 반드시 생성자의 첫줄에서만 허용된다.


06_4 메소드

  • 리턴 타입 : 메소드가 리턴하는 결과의 타입을 표시
  • 메소드 이름 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지음
  • 매개 변수 선언 : 메소드를 실행할 때 필요한 데이터를 받기 위한 변수 선언
  • 메소드 실행 블록 : 실행할 코드 작성

메소드 이름

  • 숫자로 시작하면 안되고, $와 _를 제외한 특수문자를 사용하면 안된다.
  • 관례적으로 메소드 이름은 소문자로 작성
  • 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성

매개 변수 선언

메소드에서 매개 변수가 필요한 경우가 있고 없는 경우가 있음

매개 변수가 있는 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;

06_5 인스턴스 멤버와 정적 멤버

  • 인스턴스 멤버 : 객체를 생성한 후 사용할 수 있는 필드와 메소드
  • this : 객체 내부에서 인스턴스 멤버에 접근하기 위해 사용
  • 정적 멤버 : 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
  • static : 정적 멤버를 선언할 때 사용
  • 싱글톤 : 전체 프로그램에서 단 한 의 객체만 만들도록 보장해야 하는 경우
  • final 필드 : 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 필드

06_6 패키지와 접근 제한자

  • 패키지 선언 : 해당 클래스 또는 인터페이스가 어떤 패키지에 속할 것인지를 선언하는 것
package 상위패키지.하위패키지;
  • import문 : 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면 import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 함
import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;
  • 접근 제한자 : 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막는 경우 / 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 막는 경우 사용

07_1 상속

클래스 상속

자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지를 정하고, 선택된 부모 클래스는 extends 뒤에 기술

class 자식클래스 extends 부모클래스 {
//필드
//생성자
//메소드
}

부모 생성자 호출

자식 객체를 생성하면 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성된다.


메소드 재정의

메소드 재정의란?
어떤 메소드가 자식클래스가 사용하기 적합하지 않다면 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야 하는데 이 경우 사용하게 된다.


재정의 방법

  • 부모의 메소드와 동일한 시그너처를 가져야 한다
  • 접근 제한을더 강하게 재정의 할 수 없다.
  • 새로운 예외를 throws할 수 없다.

부모 메소드 호출

자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super키워드를 붙여서 부모 메소드 호출 가능

super.부모메소드();

상속할 수 없는 final 클래스

클래스를 선언할 때 final 키워드를 class 앞에 붙이면 이 클래스는 상속할 수 없는 클래스가 된다.

public final class 클래스 {```}

재정의할 수 없는 final 메소드

메소드를 선언할 때 final 키워드를 붙이면 이 메소드는 재정의 할 수 없는 메소드가 된다.

public final 리턴타입 메소드 ( [ 매개변수, ``` ] ) {```}

07_2 타입 변환과 다형성

자동 타입 변환

자동 타입 변환이란?
프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.

자동 타입 변환이 일어나는 조건

부모 타입 변수 = 자식타입;
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();     //(가능)
	}
}

07_3 추상 클래스

추상 클래스 선언

추상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙여야 한다.

public abstract class 클래스 {
	//필드
    //생성자
    //메소드
}

08_1 인터페이스

  • 인터페이스 : 객체의 사용 방법을 정의한 타입
  • 상수 필드 : 필드이름은 모두 대문자로 작성해야 하며 선언 시 초기값을 대입해야 함
  • 추상 메소드 : 인터페이스에 선언된 메소드는 public abstract가 생략되고 메소드 선언 부분만 존재
  • 인터 페이스 사용 : 클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.

08_2 타입 변환과 다형성

다형성 : 상속돠 인터페이스는 개념상의 차이는 있지만, 모두 재정의와 타입 변환 기능을 제공한다.


09_1 중첩 클래스와 중첩 인터페이스 소개

중첩 클래스

인스턴스 멤버 클래스

static 키워드 없이 중첩 선언된 클래스
인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언 가능하고 정적 필드와 메소드는 선언 불가

정적 멤버 클래스

모든 종류의 필드와 메소드 선언 가능

로컬 클래스

접근 제한자 및 static을 붙일 수 없음 (로컬 클래스는 메소드 내부에서만 실행되기 때문에 접근을 제한할 필요가 없음)

중첩 인터페이스

클래스의 멤버로 선언된 인터페이스

class A {
	[static] interface {
    void method();
    }
}

09_2 익명 객체

익명 자식 객체

자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우

부모 클래스 [필드 : 변수] = new 부모클래스 (매개값, ```) {
	// 필드
    // 메소드
};

익명 구현 개체

구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우

인터페이스 [필드 : 변수] = new 인터페이스 () {
	// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
	// 필드
    // 메소드
};

3주차는 미루지 않고 꾸준히 하길..!!
조금씩 미루게 되네요..ㅎㅎㅠㅠ

0개의 댓글