개발자 미니민의 개발스터디

1. JAVA 객체와 클래스

by mini_min

◾ 객체 지향 프로그래밍이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방법이다.

현실에서 존재하는 실체 및 개념들을 객체라는 독립 단위로 구성하고 이 객체들의 메시지 교환을 통해 상호작용을 하여 시스템이 운영되는 개념이다. 

 

현실의 개체를 = 속성 + 메소드가 결합된 '객체'로 표현한다.

 

💥 특징

데이터 중심적이고 개발의 편리성과 효율성을 높이는데 주력함

프로그램 모듈을 재사용할 수 있다

프로그램의 확장과 유지 보수가 용이하다

 

◾ 객체는 ?

상태를 나타내는 변수 + 행동을 구현하는 메소드의 소프트웨어적인 모듈이다.

관련있는 데이터와 코드를 하나로 묶는 구성 단위이다.

개발 시간에는 ? 레퍼런스 변수로 정의

실행 시간에는 ? 클래스의 인스턴스를 의미한다.

 

◾ 객체의 구성

상태 + 동작

= 속성 + 프로시저

= 필드 + 메소드 

 

◾ 객체 지향 구성요소 

1. 클래스 : 특정 객체를 생성하기 위해 속성(필드)와 메소드를 정의하는 틀이다. 

클래스는 속성 (필드) + 메소드로 구성된다.

2. 객체는 클래스의 인스턴스 (메모리상에 할당된 것) 이다. 

클래스라는 일종의 설계도를 기반으로 실제로 생성된 실체가 객체이다. 

3. 속성은 객체의 데이터(필드) 이다.

4. 메소드는 객체에 명령을 내리는 행위라고 할 수 있다. 

 

 

◾ 클래스 : 데이터(필드) + 기능(메소드)으로 구성된다.

반드시 클래스는 대문자로 시작한다. 

필드 - 인스턴스 변수(필드)

필드는 초기화 하지 않으면 객체가 생성되는 시점에 객체는 null, 숫자변수는 0으로 초기화

인스턴스 변수는 클래스 안에서 전역 변수 와 유사하다. 

class Test1 {
//필드를 만든 것 (인스턴스 변수)
String name;
int age;
// 메소드를 만든 것 (인스턴스 메소드)
public String state() {
String s = age >= 19 ? "성인" : "미성년자" ;
return s;
}
// 메소드를 만든 것 (인스턴스 메소드)
public void write() {
//String s = state();
System.out.println(name + " : " + age + " : " + state());
}
}

 

◾ Test1 이란 클래스의 객체를 선언했다. Test1 t1;

Test1 t1;

◾ 객체를 생성하면서 메모리를 할당할 수 있다.

t1 = new Test1();
// 3) 객체 사용
System.out.println(t1.name + " : " + t1.age); // null : 0
// 필드는 초기화를 하지 않으면 메모리가 할당되는 시점에 객체는 null, 숫자변수는 0으로 초기화.
t1.name = "홍길동";
t1.age = 20;
t1.write(); // 메소드를 호출 .. 홍길동 : 20 : 성인

 

◾ Test2 라는 클래스 정의 

필드 (인스턴스 변수) : 객체를 생성해야 접근이 가능한 변수들이다. 

private 은 클래스 안에서만 접근이 가능하다.  (초기화 안하면 int 변수는 0이다)

디폴트는 동일 패키지 안에서만 접근 가능하다 (생략하면 디폴트다)

protected 는 동일 패키지 및 하위 클래스에서 접근 가능하다.

public 은 어디서나 접근 가능하다.

class Test2 {
// 필드(인스턴스변수) : 객체를 생성해야 접근할 수 있는 변수
private int a = 10; // 클래스안에서만 접근 가능.
private int b; // 초기화 하지 않으면 값은 0으로 초기화
int c = 20; // 동일한 패키지에서만 접근 가능
protected int d = 30; // 동일한 패키지 및 하위 클래스에서 접근 가능
public int e = 40; // 어디에서나 접근 가능
// ..인스턴스 메소드 : 객체를 생성해야 호출할 수 있는 메소드
public void write() {
System.out.println(a + ":" + b + ":" + c + ":" + d + ":" + e);
}
}

 

◾ a와 b는 private 이라 접근 불가. (컴파일 오류)

public static void main(String[] args) {
// 객체 선언 및 메모리 할당
Test2 t = new Test2();
// t. 찍으면 a, b는 나오지 않음. 클래스가 다르기 때문에. // 컴파일 오류
// private 는 외부 클래스에서 접근 불가
t.c = 200;
t.write();
}

 

◾ 인스턴스 변수는 new 생성자()를 호출할 때 마다 메모리 할당이 된다.

class Test3 {
//인스턴스 변수 : 객체를 생성해야 접근할 수 있는 변수다.
//인스턴스 변수는 new 생성자()를 호출할 때 마다 메모리 할당이 됨
//인스턴스 변수는 객체가 null 이 되거나 오래동안 객체를 참조하지 않는 경우 메모리가 회수됨
int a;
int b = 20;
//인스턴스 메소드 : 객체를 생성해야 접근할 수 있는 메소드다.
public void write() {
System.out.println(a + "," + b);
}
}

 

◾ t1 객체에 대한 a, b 인스턴스 변수가 메모리 할당된다.

public static void main(String[] args) {
///////////////////// new 를 하는 만큼 메모리 할당이 이루어진다.
Test3 t1 = new Test3();
// t1 객체에 대한 a, b 인스턴스 변수가 메모리 할당
Test3 t2 = new Test3();
// t2 객체에 대한 a, b 인스턴스 변수가 메모리 할당
t1.a = 100;
t2.b += 30; // t2 객체 b 필드에 30을 더함 = 0, 50
t1.write(); // t1 객체에 대한 write 메소드 호출
// 100.20
t2.write();
// 0. 50
}

 

◾ 클래스 변수 : 클래스가 메모리에 로딩될 때 한 번만 메모리가 할당된다.

객체 생성 안해도 클래스명을 가지고 바로 접근이 가능하다.

프로그램이 종료되면 메모리에서 사라진다.

인스턴스 변수는 객체를 생성해야 접근이 가능하고, 객체를 생성한 것 만큼 메모리가 할당된다.

 

클래스 메소드도 클래스명을 이용하여 바로 접근하여 사용할 수 있음.

여기서 인스턴스 변수, 인스턴스 메소드는 객체 생성해야 접근이 가능하다.

💥💥💥 (인스턴스 메소드는 클래스 메소드, 클래스 변수 그냥 접근 가능!)

class Test5 {
//인스턴스 변수 : "new 생성자()" 를 이용하여 객체를 생성해야 접근 가능
int a = 10;
int b = 20;
//클래스 변수
static int c = 30;
// 인스턴스 메소드 : "new 생성자()" 를 이용하여 객체를 생성해야 접근 가능
// : 따라서 인스턴스 변수, 클래스 변수, 다른 인스턴스 메소드, 클래스 메소드를 호출할 수 있다.
public void write() {
System.out.println(a + "," + b + "," + c);
// sub(); 이것도 가능하다.;
}
// 클래스 메소드 : 객체 생성과 무관하게 클래스명을 이용하여 바로 접근하여 사용할 수 있음.
// : 클래스 변수나 클래스 메소드는 바로 접근이 가능하다.
// : 인스턴스 변수, 인스턴스 메소드는 객체 생성해야 접근이 가능하다.
public static void sub() {
// System.out.println(a); // 컴파일오류. 인스턴스 변수 접근 불가능
// write(); // 컴파일 오류. 인스턴스 메소드는 객체 생성해야 접근 가능
System.out.println(c);
Test5 ob = new Test5();
System.out.println(ob.a);
}
}

 

◾ 클래스 변수와 메소드는 이름으로 바로 접근 가능

System.out.println(Test5.c); // 클래스 변수는 클래스 이름으로 접근
Test5.sub(); //클래스 메소드는 클래스이름으로 접근이 가능하다.
Test5 obj = new Test5();
System.out.println(obj.a);
obj.write();

 

◾ 예시~

public class Ex06 {
private int a = 10; //인스턴스 변수
private int b = 20; // "
public static int c = 100; //클래스 변수
public void write() { //인스턴스 메소드
System.out.println(a + "," + b + "," + c);
}
public static void sub() { //클래스 메소드
System.out.println(c);
}
public static void main(String[] args) {
// write() 메소드를 호출하여 결과 출력
Ex06 oa = new Ex06(); // 10, 20, 100
oa.write(); //클래스가 동일하지 않아서 붙임
// sub()메소드를 호출하여 결과 출력
sub();
}
}

 

◾ 객체 배열 !

Test8 객체를 5개 저장할 수 있는 배열을 선언한다. (메모리 할당된 것은 아니다)

t1 = null, t2 = null, t3 = null 등과 유사하다.

class Test8 {
String name; //인스턴스 변수 name, age
int age;
public String state() {
return age>=19 ? "성인" : "미성년자"; //인스턴스 메소드
}
public void write() { //인스턴스 메소드
String s = state();
System.out.println(name + " : " + age + " , " + s);
}
}

 

◾ 배열 객체에 메모리를 할당할 수 있다.

클래스에 대한 객체는 생성자를 호출해야 메모리가 할당된다.

Test8[] tt = new Test8[5];
//tt[0].age = 17;
// 배열 객체의 메모리 할당
for(int i=0; i<tt.length; i++) {
tt[i] = new Test8(); // 클래스에 대한 객체는 생성자를 호출해야 메모리 할당됨
}
tt[0].name = "이자바";
tt[0].age = 19;
tt[0].write();

 

 

 

 

 

 

블로그의 프로필 사진

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기