[혼공자] - 2주차 Chapter06 ~ 09
개념 정리
객체지향 프로그래밍
클래스, 객체, 인스턴스
https://velog.io/@debut12/클래스-객체-인스턴스
- OOP(Object Oriented Programing)
- 특정한 개념의 함수와 자료형을 함께 묶어서 관리하기 위해 탄생한 것!
클래스, 객체, 인스턴스
https://velog.io/@debut12/클래스-객체-인스턴스
특징
1. 추상화
2. 캡슐화
3. 상속
4. 다형성
5. 정보은닉
클래스의 구성 멤버
필드 (Field)
-
클래스 내의 구성 멤버 중 하나
-
클래스의 구성 멤버: 필드, 생성자, 메소드
-
멤버변수나 전역변수라고 한다.
-
객체 데이터를 저장하기 위한 역할
-
위치: 클래스 내의 생성자, 메소드가 아닌 곳
-
특징
1. 메소드 및 생성자 밖에서 선언- 값을 할당하지 않을 경우 초기값 자동 할당
- 필드를 선언하면 클래스 전역에서 사용 가능
- 최대한 메소드에서 공통으로 사용하는 필드만 선언 후 사용하기
- 필드의 값을 출력할 경우에는
this.
을 사용
필드 선언 방법
[접근제어자(public, private 등)][static, final 등] 자료형 변수명 [= 초기값] ;
[] 안의 값은 생략 가능
생성자
생성자 선언 방법
public 클래스(매개변수) { ... }
- new 연산자를 통해서 인스턴스를 생성 시 반드시 호출이 되고 제일 먼저 실행되는 역할
- 객체 초기화 담당
- 필드 초기화, 메소드 호출 -> 객체를 사용할 준비를 하는 것 - 즉, 인스턴스 변수(필드 값)을 초기화시키는 역할
생성자 오버로딩
- 매개변수의 타입을 다르게 해서 생성자를 여러 개 생성하는 것
- 매개변수의 타입, 개수, 선언된 순서가 동일할 경우에는 하나로 인식될 수 있음.
public class 클래스 {
클래스( [매개변수 ...]) {
...
}
클래스( [매개변수1, 매개변수2 ...]) {
...
}
}
메소드
- 특정 기능을 정의한 코드들의 집합
- 불필요하게 중복되어 사용하는 코드를 메소드로 정의하고 호출함으로써 가독성을 높일 수 있음
- 코드에 문제가 생길 경우 메소드만 수정하면 되기 때문에 유지보수가 편함
// Ex. main() method
public static void main(String[] args) {
System.out.println("Main() method 시작");
}
// 결과
Main() method 시작
인스턴스 멤버와 정적 멤버
인스턴스 멤버
- 객체를 생성한 후 사용할 수 있는 필드와 메소드
특징
- 클래스 영역에 선언
- 객체 없이 사용 불가
- 인스턴스 필드, 인스턴스 메소드가 있음
- 인스턴스 필드: 힙 영역
- 인스턴스 메소드: 메소드 영역에 저장 및 공유
- this 사용
접근 제한자
- 객체를 생성하지 않고 사용할 수 있는 필드, 메소드
- 클래스 영역에 선언
- static 키워드 사용
- this 사용 불가
전역 변수
의 성질
선언 위치에 따른 변수의 종류
클래스 영역에 선언
- 정적 변수 (정적 필드, 클래스 변수, static 변수)
- 인스턴스 변수 (인스턴스 필드)
클래스 영역 이외의 영역에 선언
- 지역 변수
- 필드를 제외한 나머지 변수들
- 메소드, 생성자, 초기화 블록 내부에 선언
- 변수 선언문이 실행될 때 스택 영역에 할당, 해당 블록 종료 시 메모리 해제
상속
- 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄인다.
- 부모 클래스 상속받았을 경우
- 부모 클래스 수정 시 자식 클래스 또한 수정됨
// 가능
class 자식클래스 extends 부모클래스1 {
...
}
// 불가능
class 자식클래스 extends 부모클래스1, 부모클래스2 {
// 다중 상속을 허용하지 않아 여러 개의 부모 클래스 상속 불가
...
}
- 예시!!
- extends A :: A class 상속
public class A { int field1; void method1() {...} } public class B extends A { String field2; void method2() {...} }
final 클래스
- 클래스, 필드, 메소드 선언 시 사용
- 초기값 설정 후 더 이상 값 변경이 안 됨
- 최종적인 클래스이기 때문에 상속 불가
- 즉, 부모 클래스가 될 수 없어서 자식 클래스를 만들 수 없음
// 주로 사용하는 방법
public final class String {...}
// 사용 불가능 --> extends(X)
public class NewString extends String {...}
final 메소드
- 메소드 선언 시 final 키워드 붙이면 최종적인 메소드가 되기 때문에 재정의할 수 없음
// final 메소드
public final void stop() {
...
}
- 위에서 Car 클래스의 stop() 메소드를 final로 선언
- SportsCar 클래스에서 stop() 메소드 재정의 불가!
package sec01.exam06;
public class SportsCar extends Car {
@Override
public void speedUp() { speed += 10; }
@Override
public void stop() {
// 여기서 재정의 불가!
}
}
접근제한자
- public
- protected
- default
- private
protected
- 같은 패키지 내에서는 default와 같이 접근 제한이 없음
- 다른 패키지에서는 자식 클래스의 접근만 허용
- 필드, 생성자, 메소드 선언에 사용 가능
추상클래스와 인터페이스
규칙
abstract 사용
- new를 통해 객체의 직접 생성이 불가능하다
interface의 method와 같이 구현 부분은 없다
- 반드시 자식 클래스에서 구현해야 한다
- overriding
인터페이스
규칙
- 다른 클래스를 작성하는 데 도움을 줄 목적으로 작성
- 멤버 변수는
public static final
을 사용 & 생략 가능하다 - 메서드는
public abstract
를 사용 & 생략 가능하다
public static final
- 인터페이스의 변수는 아무 인스턴스도 존재하지 않는 시점이기 때문에 스스로 초기화 될 수 없다.
- 즉, 초기화한 값을 끝까지 유지하기 위한 목적이다.
다중 상속
- 인터페이스로부터의 상속만 가능
- 자식 인터페이스: 부모 인터페이스에 정의된 멤버 모두를 상속받는다
중첩 클래스와 중첩 인터페이스
중첩 클래스, 중첩 인터페이스
- 클래스 내부에 선언한 클래스, 인터페이스
// 중첩 클래스
public class ClassName {
class NestedClass {
...
}
}
// 중첩 인터페이스
public class ClassName {
interface NestedInterface {
...
}
}
중첩 클래스 종류
- 내부 클래스 (Inner Class)
- 하나의 클래스 안에 다른 클래스 정의
특징
- 중첩되는 클래스느 한 개 이상 가능
- 일반적인 중첩 클래스 내부에서는 static과 관련된 멤버 선언 불가
- 정적 내부 클래스 (Static Inner Class)
static
관련된 멤버를 선언할 수 있는 내부 클래스
특징
- 클래스 이름 앞에static
이 붙음
- 객체를 독립적으로 사용 가능
-static 멤버, 메소드
를 만들어 사용할 수 있음
- 지역 클래스 (Local Class)
- 특정한 메소드에 한정적인 용도로 사용
특징
- 접근 제한자와 지정 예약어 사용 불가
- static 멤버 선언 불가
- 객체 생성: 외부 불가능, 내부 가능
- 익명 클래스 (Anonymous Class)
- 기존에 있는 클래스의 특정 메소드 Overriding -> 사용자가 재정의하여 사용
특징
- class 예약어와 클래스명 없음
- 생성자 작성 불가
- 외부 멤버 중 final만 포함 가능
p.330 5번 풀이
문제
결과
결과를 통한 과정 생각
1. ChildExample 실행
2. ChildExample에서 Child를 부른다.
3. Child에는 Parent를 상속받기 때문에 다시 Parent를 부른다.
4. 따라서 제일 먼저 Parent가 실행된다.
5. nation을 매개변수로 받는 Parent method가 먼저 실행이 되고 그 다음 매개변수가 없는 Parent가 실행.
6. name을 매개변수로 받는 Child method 먼저 실행 후 매개변수가 없는 Child가 실행
Author And Source
이 문제에 관하여([혼공자] - 2주차 Chapter06 ~ 09), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@debut12/혼공자-2주차-미션저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)