클래스 구성 요소 1개의 클래스는 최대 8개의 구성 요소를 가질 수 있다 [접근제한자] [기타 제한자] class 클래스이름 [extends 부모클래스] [implements 인터페이스] { [멤버변수(인스턴스변수 or 클래스변수)] [상수] [static 초기화 블록] [생성자] [멤버메소드(인스턴스메소드 or 클래스메소드)] [내부클래스] } 1 2 3 4 5 6 7 8
생성자(Constructor) 클래스로부터 인스턴스(소프트웨어 객체)가 생성될 때 객체 초기화를 위해 제공하는 특수한 형식의 메서드이다. 인스턴스 변수의 초기화 생성자 형식 메소드처럼 생겼지만 정확하게는 생성자임 특수한 목적의 메소드 생성할 때 바로 초기화 [접근제한자] 클래스이름(매개변수리스트..){ // 인스턴스 변수 초기화 코드... } 리턴 타입 없음 [ 생성자 메소드 이름 = 클래스 이름 ] 같아야 함 필요에 따라 매개변수 리스트 있음 중괄호 안에 단순한 변수 초기화 코드
생성자(Constructor) 생성자 정의 시 기본 규칙 생성자 Overloading(중복정의) 생성자의 이름은 반드시 클래스 이름과 동일하여야 한다 메서드와 같이 매개변수들을 가질 수 있으나 리턴타입을 명시하지 않는다 객체 생성시 전달인자를 사용하여 원하는 인스턴스 변수를 초기화 할 수 있다 생성자는 직접 호출할 수 없고 반드시 new 키워드와 함께 호출하여야 한다 생성자 Overloading(중복정의) 매개변수의 데이터타입과 개수를 달리하면 동일한 이름으로 여러 개의 생성자를 정의할 수 있다 다양한 방법으로 인스턴스를 생성할 수 있는 장점을 가진다. 만일 개발자가 생성자를 명시적으로 정의하지 않을 경우, 컴파일 시 컴파일러에 의해 매개변수가 없는 디폴트 생성자가 자동 정의된다. 다이렉트로 호출 불가 new라는 키워드와 함께 호출 매개변수 갯수와 데이터 타입 달라야 함
생성자 - 예 // 객체 모델링 클래스(객체 추상화) class Box{ int width; int height; int depth; int vol; // 클래스의 이름과 같은 이름으로 생성자 정의 // 인스턴스 변수 초기화 수행 Box(int a, int b, int c){ width = a; height = b; depth = c; } int getVolume() { vol = width * height * depth; return vol; // 애플리케이션(메인) 클래스 class BoxExam { public static void main(String[] args) { Box mybox1 = new Box(10, 20, 30); vol = mybox1.getVolume(); System.out.println("mybox1 객체의 부피 : " + vol); 생성자는 값을 받아서 값만 할당 계산해 주는 것은 아님 인스턴스 생성해 놓고 값을 담는 게 아니고 생성할 당시에 바로 값 초기화 (코드 간결해짐)
생성자 오버로딩(overloading) - 예 Box mybox1 = new Box(); Box mybox2 = new Box(5); Box mybox3 = new Box(5, 10); Box mybox4 = new Box(5, 10, 15); class Box { int width; int height; int depth; Box() { width=1; height=1; depth=1; } Box(int w) { width=w; Box(int w, int h) { width=w; height=h; depth=1; } Box(int w, int h, int d) { depth=d; 4개의 생성자가 서로 다른 매개변수를 가진다
생성자 오버로딩 - 예 class Box { int width, height, depth; double dwidth, dheight, ddepth; Box(int w, int h, int d) { width=w; height=h; depth=d; } Box(double w, double h, double d) { dwidth=w; dheight=h; ddepth=d; 매개변수의 개수는 같지만 타입이 다른 경우 Box mybox5 = new Box(5, 10, 15); Box mybox6 = new Box(20.3, 10.7, 15.23);
예약어 - this “this”는 현재 실행중인(생성되어 있는) 인스턴스를 참조하는데 사용한다. class Box { 인스턴스 생성시 JVM에 의해 자동으로 생성되는 레퍼런스 변수 생성자 또는 메소드의 매개변수와 인스턴스변수가 같을 경우 사용 클래스내의 다른 생성자를 호출할 때 사용 – this(); 불필요한 코드 중복을 막을 수 있다. class Box { int width; int height; int depth; Box(int width, int height, int depth) { width=width; // 같은 매개변수의 값을 할당 height=height; depth=depth; }
예약어 - this class Box { int width; int height; int depth; public Box(int width, int height, int depth) { this.width = width; this.height = height; this.depth = depth; } this.width는 현재 객체의 인스턴스 변수 width를 의미한다. this를 사용 함으로서 인스턴스변수와 다른 이름의 매개변수를 선언할 필요가 없다.
예약어 – this class Box { int width; int height; int depth; public Box() { this(1,1,1); } public Box(int w) { this(w,1,1); public Box(int w, int h) { this(w,h,1); public Box(int width, int height, int depth) { this.width=width; this.height=height; this.depth=depth; 이 클래스는 어떠한 형태로 객체가 생성되어도 결국 마지막 생성자가 호출된다. 여기서 사용된 this()는 같은 클래스 내의 다른 생성자를 호출하는 역할을 한다
예약어 - this Class JavaTest{ int value1; double value2; //디폴트 생성자 public JavaTest(){ } //int형 변수를 인자로 받는 생성자 public JavaTest(int x){ value1 = x; } //double형 변수를 인자로 받는 생성자 public JavaTest(double y){ value2 = y; //int형 변수와 double형 변수를 인자 받는 생성자 public JavaTest(int x, double y){ //위의 두개의 생성자를 각각 호출한다. this(x); //JavaTest(int x) 호출 this(y); //에러 발생 this.value2 = y; this()는 생성자 안에서 생성자의 첫 줄에서 단 한번밖에 사용할 수 없다. 여러 번 호출 X 생성자 제일 첫 줄 앞에서 단 한 번 사용 가능
클래스 접근 제한자(Modifiers) 클래스 정의 시 클래스를 접근할 수 있는 권한을 부여할 수 있는 키워드 [public/생략] class ClassName { //… } public : public은 다른 패키지의 어떤 클래스에서도 이 클래스를 접근 (클래스의 객체 생성)할 수 있다 접근 제한자를 지정하지 않으면(Default) 같은 패키지내의 클래스들만 접근 가능 public이 생략되어 있으면 같은 패키지 클래스 안에서만 접근 가능 생략되어 있지 않으면 다른 패키지(다른 디렉토리) 어떤 클래스에서도 이 클래스에 접근 가능
변수 접근 제한자 (Modifiers) 인스턴스 변수 선언 [public//protected/생략/private] 데이터타입 변수명; 자바는 객체지향의 특성인 정보 은폐(information hiding)를 제공하기 위해 인스턴스 변수에 접근 제한자 를 사용 접근 제한자가 없는 인스턴스 변수는 동일한 패키지에서 사용 가능 1 2 3 4 1
변수 접근 제한자 - public “public”으로 선언된 인스턴스 변수는 패키지에 상관없이 모든 클래스에서 사용 가능 class Box { public int width; public int height; public int depth; public long idNum; } class PublicDemo { public static void main(String args[]) { Box mybox1 = new Box(); mybox1.width = 7; // 접근 가능 mybox2.depth = 20; // 접근 가능 이 방법은 거의 사용 x
크기 순서 public > protected > 생략 변수 접근 제한자 - protected public보다 접근 범위 작아짐 완전 오픈이 아닌 부분적 오픈 “protected”로 선언된 멤버 변수는 소속된 클래스의 하위 클래스와 소속된 클래스와 같은 패키지의 클래스에서만 사용가능 class Box { private int width; private int height; private int depth; protected int count; // 이 클래스와 이 클래스의 하위 클래스에서 사용 ..........… } class ProtectedDemo1 extends Box { // extends를 이용하여 Box 클래스의 하위 클래스로 생성 public static void main(String args[]) { Box mybox2 = new Box(); mybox2.count = 7; // 접근 가능 …………….. 자신한테 상속된 것까지
변수 접근 제한자 - private “private”으로 선언된 인스턴스 변수는 소속된 클래스 내에서만 사용 가능 class Box { private int width; // private로 선언 이 클래스 내부에서만 사용 private int height; private int depth; } class PrivateDemo { public static void main(String args[]) { Box mybox1 = new Box(10, 20, 30); mybox1.width = 7; // 에러 발생 private가 있으면 패키지에 상관 없이 중괄호 안에서만 사용 가능
메소드 접근 제한자 접근 변경자 public/protected/생략/private는 인스턴스 변수 접근 제한자와 동일한 의미를 가진다. 클래스 접근 제한자가 public이면 생성자 접근 제한자도 public(생략 가능)
생성자는 인스턴스 초기화 스태틱 변수는 생성자에서 초기화 하는 것이 아니라 코드 자체에서 초기화 시킴 접근할 때도 공유하는 개념이니까 바로 접근함 변수 기타 제한자 - static 인스턴스 변수 변수 앞에 static 키워드를 붙임으로 써 인스턴스에 상관없이 공유할 수 있는 변수의 개념을 가진다. 클래스(static) 변수라 한다. 인스턴스 변수(객체참조,객체속성)는 객체가 생성될 때마다 각 객체에 변수들이 생성되지만, 클래스 변수는 클래스로부터 생성된 객체들의 수와 상관없이 하나만 생성 한 클래스로부터 생성된 모든 객체들은 클래스 변수를 공유 클래스 변수를 이용하여 객체들 사이의 통신에 사용하거나 객체들의 공통 속성을 나타낼 수 있다. 인스턴스변수와는 달리 클래스 변수는 클래스 이름을 통하여 접근 클래스명 . 변수명 Account.java 파일에서 이름이나 계좌번호, 비밀번호, 현재 잔액은 다 다르지만 은행 이름은 다 같기 때문에 은행 이름에는 static이 붙어 변할 거에는 static을 쓰지 않고 변하지 않을 값에만 붙임
Account account = new Account(); ① ③ ② Account account2 = new Account(); *JVM에 의해 관리되는 메모리 구조 static 영역 stack 영역 heap 영역 같음 인스턴스들 클래스 변수 클래스 메소드 주소 stack 영역 account 클래스 변수 = 스태틱 변수 클래스 메소드 = 스태틱 메소드 stack : account의 지역변수가 할당되는 곳 static : static 자체가 로드되는 static 영역 셋 중 스태틱이 성능이 가장 빠름 업무 분석상 반드시 공유해야 하는 것만 스태틱에 stack 영역
클래스(static) 변수 Test(클래스) 객체 생성 없이 Test.number로 클래스 변수에 접근 할 수 있다 static int number; 객체생성 객체 고유 데이터 객체 고유 데이터 객체 고유 데이터 객체 고유 데이터 객체 a 객체 b 객체 c 객체 d
클래스 변수 접근 - 예 class A { int aa; int bb; int cc; static int s = 0; } class ATest { public static void main(String args[]) { A obja = new A(); obja.aa = 4; // 레퍼런스 변수를 통해 멤버 변수에 접근 obja.bb = obja.aa * 2; obja.cc = A.s; // 멤버 변수에 클래스 변수값을 저장 ....................
클래스 변수 접근 - 예 class Box { int width; int height; int depth; static 사용 시 인스턴스에 상관없이(패키지에 상관없이) 접근 가능 – 굳이 인스턴스 안 만들어도 바로 호출 가능ㅇ 클래스 변수 접근 - 예 class Box { int width; int height; int depth; long idNum; static long boxID = 0; // 클래스 변수 선언 public Box() { idNum = boxID++; // 생성자가 수행될 때마다 클래스 변수의 값을 증가 } 패키지에 상관없이 접근할 때 box.boxID Box 클래스로부터 생성되는 모든 객체의 idNum 값은 객체가 생성되는 순서에 따라 1씩 증가된 값을 가진다
변수에 대한 상수 처리 - final 예약어 final을 사용하여 종단변수 지정 변할 수 없는 상수 값을 나타낸다 변수에 어떤 값이 있는데 그 값을 프로그램 끝날 때까지 변경 x (리드 온리, 쓰기 x) 변수에 대한 상수 처리 - final 예약어 final을 사용하여 종단변수 지정 변할 수 없는 상수 값을 나타낸다 종단변수는 관례상 대문자로 표기한다(가독성) final int MAX = 100; final int MIN = 1; 상수는 All 대문자 상수는 대부분 공유해서 사용하기 때문에 多 public static final ~~~
클래스 메소드 - static “static”을 붙여 클래스 메소드 선언 클래스 변수와 같이 클래스로부터 객체를 생성하지 않아도 클래스 명을 통하여 직접 접근(호출)할 수 있다. 클래스명 . 메소드명(아규먼트); Math 클래스에는 많은 클래스 메소드들이 존재한다.