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