본문 바로가기

코딩/JAVA 공부

[JAVA] 자바의 정석 _ 객체지향 언어

객체지향 언어 = 프로그래밍 언어 + 객체지향 개념, 규칙

--> 코드의 재사용성을 높이고, 유지보수를 용이하게 해 줌.

객체지향 OOP (Object - Orinted Programing)의 핵심 특징

1. 캡슐화

2. 상속

3. 추상화

4. 다형성

 

 * 클래스와 객체

클래스 : 객체를 정의해 놓은 것. 객체를 생성하는 데 사용함.

객체 : 실제로 존재하는 것. 그 자체..?

ex) 클래스 : 제품 설계도 / 객체 : 제품

인스턴스 : 특정 클래스로부터 생성된 객체

// 조금 다르겠지만 파이썬에서 함수를 생성--> 클래스 생성 / main 함수에서 호출 --> 인스턴스 만들기와 비슷한 듯하다.

 

* 클래스 작성 시 유의사항

기본적으로 소스파일 이름과 class 이름은 일치해야 함 (즉 하나의 소스파일에 하나의 클래스)

부득이하게 1개 이상 작성할 때, public class와 소스파일의 이름이 일치해야 함.

** Hello2.java 소스 파일 내
public 	class Hello2{}
	class Hello3{}		// okay
        
//public이 없는 경우 둘 다 가능
class Hello2{}
class Hello3{}

* 객체의 생성과 사용

객체의 생성

클래스명 변수명(참조 변수);

변수명 = new 클래스명();   // 마치 참조형 변수 선언하듯!

Tv t;		// Tv클래스 타입의 참조변수 t 선언
t = new Tv();	// Tv인스턴스 생성, 주소를 t에 저장

Tv t = new Tv(); // 한 줄로 선언 및 생성 가능

객체의 사용 : 변수, 메서드 사용

t.channel = 7
t.channelDown();

 

* 객체 배열

객체 배열 == 참조 변수 배열 

Tv[] tvArr = new Tv[3];	//선언
trArr[0] = new Tv();	//생성
trArr[1] = new Tv();
trArr[2] = new Tv();

Tv[] tvArr = {new Tv(), new Tv(), new Tv()}; // 선언, 생성 한번에하기

배열의 각 아이템이 Tv 인스턴스. (Tv 객체의 주소 값)

 

 * 클래스의 정의

클래스는 세 가지 관점으로 볼 수 있음.

1. 설계도 (앞에 설명한 내용들)

2. 데이터 + 함수

  구조체 : 서로 관련된 여러 데이터 (종류 관계 x)를 하나로 저장할 수 있는 공간

  클래스 : 구조체 + 함수(메서드) - 서로 관련이 있어 하나로 묶음

3. 사용자 정의 타입

  원하는 타입을 직접 만들 수 있음.

class Time{
    int hour;
    int minute;
    int second;
}

Time t = new Time();

 

 * 클래스 내 변수 선언 위치, 종류

영역 종류

1. 클래스 영역 - 선언문만 가능 (변수, 메서드)

2. 메서드 영역 - 메서드의 시작~끝

 

변수 종류

1. iv(instance variable) : 인스턴스 변수, 클래스 영역에서 선언 / 인스턴스(객체) 생성됐을 때 생성.

2. cv(class variable) : static + iv , 클래스 영역에서 선언 / 클래스가 Ram에 올라갈 때 자동 생성 (따로 선언하지 않아도) --> 아무 때나 사용 가능

3. lv (local variable) : 메서드 내 지역변수, 메서드 영역에서 선언 / 메서드가 호출될 때 생성, 종류 시 제거.

class Variables{
    int iv;		// 인스턴스 변수
    static int cv;	// 클래스 변수
    
    void method(){
    	int lv = ;	// 지역 변수
    }
}

 

 * 클래스 변수 인스턴스 변수

클래스에서 각 객체마다 개별적인 속성 : 인스턴스 변수(iv)

                   각 객체마다 공통적인 속성 : 클래스 변수 (cv)

ex) 카드 생성 class에서, 카드 번호, 무늬 = 개별적인 속성 --> iv

                                        카드 가로, 세로 = 공통적인 속성 --> cv

class Card{
    String kind;	// 무늬
    int number;		// 숫자
    
    static int width = 100; // 폭
    static int height = 250;// 높이	
}

iv, cv 호출

iv는 호출 및 선언 시 참조 변수 사용

cv는 호출 및 선언 시 클래스 이름 사용

Card c = new Card();
c.kind = "Heart";
c.number = 5;
Card.width = 200;
Card.height = 300;

객체가 2개 생기면 iv는 객체 수 맞춰서 생성됨.

그러나 cv는 객체 수와 상관없이 1 set만 생성됨. (iv와 cv는 메모리에서 생성되는 장소도 다름)

Card c1 = new Card();
Card c2 = new Card();

c1.weith = 50;
c1.height = 80;

System.out.println(c2.weith)	// 50
System.out.println(c2.height)	// 80

위 코딩처럼 Card 객체 c1, c2 2개 생성한 후 c1의 cv를 변경하면 c2의 cv도 함께 변경됨!