객체지향

윤주영·2024년 11월 2일

패키지

  • 서로 관련된 클래스의 묶음
  • 클래스는 클래스 파일(*.class), 패키지는 폴더.하위 패키지는 하위 폴더
  • 클래스의 실제 이름(full name)은 패키지를 포함.(java.lang.String)
    rt.jar는 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)
    java9부터 rt.jar이 사라짐 모듈개념

패키지 선언

  • 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
  • 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
  • 패키지 선언이 없으면 이름없는(unnamed)(default package) 패키지에 속하게 된다.

클래스 패스

  • 클래스 파일(*.class)의 위치를 알려주는 경로(path)
  • 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
    classpath(환경변수)에 패키지의 루트를 등록해줘야함

import문

  • 클래스를 사용할 때 패키지이름을 생략할 수 있다.
  • 컴파일러에게 클래스가 속한 패키지를 알려준다.
  • java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.(기본패키지)
    String,Object,System, Thread ...

import java.lang.* <- '*'은 모든클래스를 뜻한다.

import문의 선언

  • import문을 선언하는 방법은 다음과 같다.
  • import문은 패키지문과 클래스선언의 사이에 선언한다.

    import 패키지명.클래스명;
    또는
    import 패키지명.*;

  • import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음
    import java.util.Calendar;
    import java.util.Date;
    import java.util.ArrayList;

    import java.util.*;
  • 다음의 두 코드는 서로 의미가 다르다.
    import java.util.;
    import java.text.
    ;

    import java.*; - java 패키지의 모든클래스(패키지는 포함안됨)
  • 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 붙여줘야한다.

static import문

  • static멤버를 사용할 때 클래스 이름을 생략 할 수 있게 해준다.

제어자

  • 클래스와 클래스 멤버(멤버 변수,메서드)에 부가적인 의미 부여(형용사+명사)
    접근제어자는 4개중에 1개만 붙혀야한다.

  • 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)

public class ModifierTest {
	public static final int WODTH = 200;
	public static void main(String[] args) {
		System.out.println("WODTH="+WODTH);
	}
}

static - 클래스의 공통적인

제어자 	대상 		의미
static  멤버변수 	- 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
				    - 클래스 변수는 인스턴스에 생성하지 않고도 사용 가능하다.
				    - 클래스가 메모리에 로드될 때 생성된다.
		메서드		- 인스턴스를 생성하지 않고도 호출한 가능한 static 메서드가 된다.
				- static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
class StaticTest{
	static int width = 200;	//클래스 변수(static변수)
	static int height = 120;//클래스 변수(static변수)
	
	static {	//클래스 초기화 블럭
		// static변수의 복잡한 초기화 수행
	}
	static int max(int a, int b) {	//클래스 메서드(static메서드)
		return a > b ? a : b;
	}
}

final - 마지막의, 변경될 수 없는

제어자 	대상 		  의미
final	클래스 	   - 변경될수 없는 클래스. 확정될수 없는 클래스가 된다.
				   - 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다
		메서드 	   - 변경될 수없는 메서드. final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수없다.
		멤버변수    - 변수 앞에 final이 붙으면, 값이 변경할 수 없는 상수가 된다.
		지역변수
		
final class FinalTest{	//조상이 될 수 없는 클래스
	final int MAX_SIZE = 10;	//값을 변경할 수 없는 멤버변수(상수)
	
	final void getMaxSize() {	// 오버라이딩할 수 없는 메서드(변경불가)
		final int LV = MAX_SIZE;	//값을 변경할 수 없는 지역변수(상수)
		return MAX_SIZE;
	}
}

abstract - 추상의, 미완성의

제어자			대상 			의미
abstract 	   클래스		- 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
			   메서드		- 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
abstract class AbstractTest {	//추상클래스(추상메서드를 포함한 클래스,미완성설계도)
	abstract void move();	// 추상메서드(구현부가 없는 메서드, 미완성메서드)
}

Abstract a = new Abstract() // 에러. 추상 클래스의 인스턴스 생성불가

접근제어자

private 같은 클래스 내에서만 접근 가능하다.
(default) 같은 패키지 내에서만 접근 가능하다.
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public 접근 제한이 전혀 없다.

public > protected > (default) > private
(접근제한없음) 같은패키지+자손 같은패키지 같은클래스

class AccessModifierTest{ // class에는 public,(default)
	// public,protected,(default),private 멤버변수에 들어갈수있다.
	int iv;	// 멤버변수(인스턴스변수)
	static int cv; // 멤버변수(클래스변수)
	void method(){}
}

캡슐화와 접근 제어자

접근제어자를 사용하는이유

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한, 내부적으로만 사용되는,부분을 감추기 위해서

다형성

  • 여러가지 형태를 가질 수 있는 능력

  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것

    Tv t = new SmartTv(); // 타입 불일치 ok

  • 객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이?

    SmartTv s = new SmartTv(); //참조변수와 인스턴스의 타입이 일치
    Tv t = new SmartTv(); // 조상타입 참조변수로 자손타입 인스턴스 참조

  • 자손 타입의 참조변수로 조상 타입의 객체를 가리킬수 없다 X

    Tv t = new SmartTv(); // Ok 허용
    SmartTv s = new Tv(); // 에러. 허용 안됨

정리
Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?
A. 아닙니다. 일치하는 것이 보통이지만 일치 하지 않을 수도 있습니다.
Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?
A. 참조변수로 사용할 수 있는 멤버의 갯수가 달라집니다.
Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?
A. 아니요. 허용되지 않습니다.

profile
반갑습니다.

0개의 댓글