티스토리 뷰

<Class : class는 설계도 이다.>

클래스(Class) : class는 설계도 이다.

객체를 만들기 위해 필요한 객체의 설계도라고 볼 수 있다. 자료형이 다른 변수들을 메모리에 연속 나열 할당하기 위한 순서를 지정하는 역할을 하며, 클래스 블록 { } 이 캡슐의 역할을 하여 객체 외부에서 멤버변수(Field)로의 접근을 제한하며, 멤버변수들을 하나의 타입으로 묶어 주는 것이 클래스이다.

 

객체(Object) 와 인스턴스(Instance)

추상화가 이루어진 클래스로부터 데이터가 존재하는 실체로 만드는 과정을 인스턴스화(instantiation) 라고 하며, 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다. 자바에서는 객체, 즉 인스턴스는 무조건 메모리 힙(Heap) 영역에 할당하도록 정하였으며 할당된 객체의 주소를 기록할 참조(Reference)변수를 사용하여 객체를 참조하도록 정해 두었다.

 

접근 제한자 (Access Modifier)

클래스에 속한 멤버변수(Field)와 멤버함수(Method) 들을 클래스 외부(다른 클래스)에서의 접근에 대한 제한을 걸기 위해 사용되는 단어를 말한다.

접근 제한자의 종류는 다음과 같다.

  • (+) public
    • 클래스 안과 밖, 패키지 안과 밖에 있는 모든 클래스들이 접근 가능하다.
  • (#) protected
    • 비 상속시에는 default와 동일하며, 같은 패키지에 속한 클래스 간에만 멤버의 접근이 가능 ,
    • 다른 패키지에 있는 클래스일 때는 상속관계의 후손클래스 내에서만 부모클래스의 멤버에 접근이 가능하다.
  • (~) default(package private)
    • 같은 패키지에 속한 클래스 간에만 멤버들에 대한 접근이 가능하다.
  • (-) private
    • 멤버변수의 캡슐화를 위해 사용되는 제한자로 클래스 안에서만 접근이 가능하며 클래스 밖에서는 접근이 불가능 하다.

 

클래스 구조

클래스는 클래스 헤더(Header) 시그니처(Signature)와 클래스 바디(Body)로 구성된다.

클래스 헤더 시그니처는 클래스의 이름과 종류를 지정하는 부분이고, 클래스 바디 안에는 클래스의 멤버들이 정의되는 부분이다.

 

1. 클래스 헤더

클래스 작성시 클래스의 이름과 종류를 정의하는 클래스 시그니처는 다음과 같다.

[접근제한자] [클래스식별자] class 클래스이름

접근제한자 : 클래스의 접근에 제한을 두는 예약어로 public과 default (package private) 두 가지가 사용된다.

  • public class 클래스명 : 패키지 안/밖 모두 접근(사용) 가능한 클래스
  • class 클래스명 : 선언된 패키지 안에서만 접근(사용) 가능한 클래스

클래스 식별자 (Identifier) : 클래스의 종류를 지정하는 예약어로 final, abstract 두 가지가 사용될 수 있다.

  • public final class 클래스명 : 종단 클래스, 더 이상 상속시킬 수 없어 서브(후손) 클래스를 만들 수 없다.
  • public abstract class 클래스명 :  추상(미완성된) 클래스, 상속을 이용해 서브 클래스가 부모의 미완성된 기능을 완성시킨다.

Member

  • field : 속성 = 멤버 변수
  • method : 기능 = 멤버 함수, 명령문들의 집합

 

Constructor (생성자)

  • 해당 타입의 객체를 생성해 준다
  • feild 초기화 하는 주요 역할을 담당한다.
  • 클래스의 이름과 동일하되, 리턴타입은 없고, 객체 생성시의 접근 제한자는 public 이다.   
class Test {
	public Test() {
		// 생성자 입니다.
	}
}
  • 생성자는 객체 생성을 하는 new 연산자와 함께 사용되며, 생성시 단 한번만 자동 호출된다.
 Test t = new Test();   // new 생성자();
  • 메서드처럼 객체 및 클래스명으로 호출될 수 없다.
t.Test(); X 
Test.Test(); X
  • overload 할 수 있다.
Class Test {
	public Test() {} 	//defualt constructor (기본 생성자) 
    	public Test(int a) {} 
    	public Test(int a, int b) {} 
}
  • 생성자를 명시하지 않으면 자바가 기본 생성자를 제공하여 필드를 초기화하고, 명시된 생성자를 선언하게 되면 명시 생성자만 호출되고 기본 생성자는 제공되지 않는다.
public class AA {
	// new AA(); O
}

public class BB {
	public BB() {} // new BB(); O
}

public class CC {
	public CC(int cc) {} // new CC(); X -> new CC(10); O
}
  • 생성자는 상속되지 않는다. (단지 자식 클래스의 생성자 호출 시 부모클래스의 생성자 또한 호출된다.)
  • 생성자는 내부 호출이 가능하며, 키워드는 this() 이다.
  • 생성자의 목적은 객체 생성과 필드 초기화에 있다.
  • Super Class : 나의 부모 클래스를 의미한다.

 

 

<instance : 객체>

  • 객체를 생성한다 == 메모리에 할당한다.
  • Class 를 Memory에 적재한 구현체
  • ex) Car car = new Car();   //car 라는 이름의 객체 생성

 

TEST Code

 

test 를 위한 class 구성도 입니다.

package com.bbb;

import com.aaa.AAA;

public class MTest {

	public static void main(String[] args) {
		BBB b1 = new BBB(); // 기본 생성자 호출
		
		b1.setAbc(1);
		b1.setB(2);
		System.out.println(b1.getAbc() + " + " + b1.getB() + " = " + b1.getSum());
		
		BBB b2 = new BBB(3);
		System.out.println(b2.getAbc() + " + " + b2.getB() + " = " + b2.getSum());
		
		BBB b3 = new BBB(3, 2);
		System.out.println(b3.getAbc() + " + " + b3.getB() + " = " + b3.getSum());
		
		System.out.println("==============================");
		
		AAA a1 = new AAA();
		AAA a2 = new BBB();	//부모타입으로 자식 객체 생성 가능
		//BBB b4 = (BBB) new AAA();
		a1.prn();
		a2.prn();
		//b4.getSum();
		
	}
}
package com.aaa;

public class AAA {

	// field : 속성
	private int abc;

	// default constructor(기본 생성자)
	public AAA() {
		System.out.println("AAA() 생성");
	}
	
	public AAA(int abc) {
		this.abc = abc;
		System.out.println("AAA(abc) 생성");
	}

	// getter & setter
	public int getAbc() {
		return abc;
	}
	
	public void setAbc(int abc) {
		this.abc = abc;
	}
	
	public void prn() {
		System.out.println("AAA의 메서드 prn()");
	}
	
}
package com.bbb;

import com.aaa.AAA;

/*
 * AAA 를 상속받은 클래스 BBB
 */
public class BBB extends AAA {

	// field
	private int b;

	// constructor
	public BBB() {
		// super(); //부모의 생성자를 명시하지 않는 경우, 부모의 기본 생성자를 자동 호출!! public AAA()
		System.out.println("BBB() 생성");
	}

	public BBB(int b) {
		super(b); // 부모의 생성자 public AAA(int abc)
		this.b = b;
		System.out.println("BBB(int b) 생성");
	}

	public BBB(int abc, int b) {
		super(abc); // 부모의 생성자 public AAA(int abc)
		this.b = b;
		System.out.println("BBB(int abc, int b) 생성");
	}

	// getter & setter
	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	// method

	public int getSum() {
		//super : 부모 객체
		//this : 나 객체
		int sum;
		sum = super.getAbc() + this.getB();		//super.getAbc(), getAbc(), this.getAbc() 모두 가능
		sum = this.getAbc()  + this.getB();		// O
		sum = getAbc() 		 + this.getB();		// O
		sum = super.getAbc() + getB();			// O
		sum = this.getAbc()  + getB();			// O
		sum = getAbc() 		 + getB();			// O
		return sum;
	}

	public void prn() {
		System.out.println("BBB의 메서드 prn()");
	}
}

코드의 결과 입니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함