[Java] Ch.6 객체지향 프로그래밍1

yoons(이윤서)·2024년 6월 24일

[Java] 자바의 정석

목록 보기
6/14

👉🏻 이 글은 자바의 정석(3판) Chapter6을 공부하며 쓴 글입니다.


📌 객체지향언어

  • '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.'
  • '코드의 재사용성이 높고 유지보수가 용이하다.'

📌 클래스와 객체

  • 클래스 : 객체를 정의해 놓은 것
    --> 용도 : 객체 생성할 때 사용

    • 데이터와 함수의 결합
    • 사용자정의 타입
  • 객체 : 실제로 존재하는 것. 사물 또는 개념
    == 클래스에 정의된 내용대로 메모리에 생성된 것

JDK(Java Development Kit)에서는 많은 수의 유용한 클래스(Java API)를 기본적으로 제공하고 있다.

📖 객체와 인스턴스

  • 인스턴스(instance) : 클래스로부터 만들어진 객체
  • 인스턴스화(instantiate) : 클래스로부터 인스턴스를 만드는 과정

인스턴스의 생성과 사용

클래스명 변수명;	// 클래스 객체 참조를 위한 참조변수 선언
변수명 = new 클래스명();	// 객체 생성 후 참조변수에 저장
  • 하나의 참조변수는 하나의 값(주소)만이 저장될 수 있으므로 여러개의 인스턴스를 가리키는 것은 가능하지 않다.

📖 객체 배열

많은 수의 객체를 관리할 때, 배열로 다루면편리할 것이다.

  • 객체 배열 안에는 객체의 주소가 저장된다.
  • 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열인 것이다.
Tv tv1, tv2, tv3;
--> TV[] tvArr = new Tv[3];

길이가 3인 객체 배열을 위와 같이 생성하명, 각 요소는 참조변수의 기본값인 null로 자동 초기화 된다. 아직 객체가 저장되지 않은 상태이다.

	tvArr[0] = new Tv();
    tvArr[1] = new Tv();
    tvArr[2] = new Tv();
    
    // or
    
    Tv[] tvArr = { new Tv(), new Tv(), new Tv() };
    
    // or
    
    Tv[] tvArr = new Tv[100];
    
    for(int i=0; i<tvArr.length; i++){
    	tvArr[i] = new Tv();
    }

📌 변수와 매서드

📖 변수

"변수의 선언된 위치"
-> 클래스 변수(static 변수, 공유변수) , 인스턴스 변수(static X) , 지역 변수

  1. 인스턴스 변수 (instance variable)
    클래스 영역 안에 선언.
    인스턴스마다 서로 고유한 상태를 유지해야 하는 경우 선언.
    인스턴스가 생성될 때 마다 생성된다.

  2. 클래스 변수 (class variable)
    static (정적인, 고정적인, 클래스의, 공통적인)을 앞에 붙이면 됨.
    클래스 변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유하게 된다.
    한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성인 경우, 클래스 변수로 선언해야 한다.

  3. 지역 변수 (local variable)
    메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 사용할 수 없게 됨. 선언된 블럭 {} 내에서만 유효.

    .

  • 매개 변수 (parameter)
    : 자바에서는 매개변수가 기본형일 때, 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 인스턴스 주소를 알 수 있기 때문에 값을 변경하는 것도 가능하다.

📖 메서드

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

메서드의 선언과 구현

반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) {
	//메서드 호출시 수행될 코드
}

매개변수 선언시 주의할 점은 두 변수의 타입이 달라도 생략할 수 없다는 것이다.
매개변수도 지역변수이다.
반환값이 없는 경우 반환타입으로 void를 적어야한다.

  • return
    이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한것이어야 한다. 단 하나의 값만 반환 가능하다.

    매개변수뿐만 아니라 반환값도 참조형이 될 수 있는데, 이 때 객체의 주소(정수값)이 반환된다.

  • 지역변수 (local variable)
    메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 된다.

메서드 호출

메서드이름(값1, 값2);	// 이때 값1,2를 인자(argument)라 한다.
  • 유효성 검사
    : 매개변수의 값이 적절한 값인지 확인하는 것 (ex. 나누기 함수에서 0이 매개변수로 받는 경우). 매개변수의 유효성 검사는 메서드 작성에서 간과하기 쉬운 중요한 부분이다.

📖 클래스 메서드와 인스턴스 메서드

변수와 마찬가지로 static이 붙어있으면 클래스 메서드이고, 아니면 인스턴스 메서드이다.

  • 인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.

  • 인스턴스와 관계없는 (인스턴스 변수나 메서드를 사용하지 않는) 메서드를 클래스 메서드를 클래스 메서드로 정의한다.

  1. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
    : 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다.

  2. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙일 것을 고려한다. (메서드 호출시간이 짧아지므로 성능이 향상된다.)

📖 JVM 메모리 구조

: 응용프로그램 실행 -> JVM은 필요한 메모리를 할당받고, -> JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

Class File -> Class Loader System -> Runtime Data Area
⬇️ Runtime Data Area

=========

  • 매서드 영역 (Method Area)
    -> 클래스 데이터 저장, '클래스 변수' 생성

=========

  • 호출스택 (Call Stack)
    -> 지역변수가 포함된 '메서드' 작업에 필요한 메모리 공간을 제공한다.
    -> main메서드, ....등등이 스택형태로 저장됨

=========

  • (heap)
    -> '인스턴스 변수'가 생성되는 공간.

=========
+ PC Register, Native Method Stack

-> 실행 엔진 (Execution Engine)

📖 재귀 호출

사용이유: 논리적 간결함.

조건문 필수! 만약 조건문이 잘못 설정되면 재귀호출이 계속 일어나고 메서드는 종료되지 않으므로 스택만 쌓여간다.
-> "스택오버플로우 에러" 발생.
(매개변수의 값이 1,000,000과 같이 큰 경우에도 발생한다.)
-> 그래서 '매개변수의 유효성 검사'가 중요한 것이다.

⚠️ 재귀호출은 비효율적이므로 비용보다 간결함이 주는 이득이 더 클 때 사용한다.


📌 오버로딩 (Overloading)

오버로딩이란?
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
하나의 메서드 이름으로 여러 기능을 구현하기 때문에 붙여진 이름이다.

➡️ 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
    (매개변수에 의해서만 구별될 수 있다. 반환타입은 아무런 영향을 주지 못한다.)

Ex.

	void println()
    void println(boolean x)
    void println(char x)
    void println(double x)
    ...
    

📖 가변인자 (varargs)

타입... 변수명 과 같은 형식으로 선언
위의 가변인자는 매개변수 중 가장 마지막에 선언해야 한다.

	String concatenate(String s1, String s2) {...}
    String concatenate(String s1, String s2, String s3) {...}

⬇️ 가변인자를 사용하면 메서드 하나로 간단히 대체 가능하다.

	String concatenate(String... str) {...}

📌 생성자

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴값이 없다
  3. 클래스 내에 선언된다.
  • 기본 생성자
    클래스이름() { }
    기본생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

  • 매개변수가 있는 생성자

this(), this

: 생성자에서 다른 생성자 호출. this는 참조변수로 인스턴스 자신을 가리킨다.

생성자를 이용한 인스턴스의 복사

	Car(Car c) {
    	color = c.color;
        gearType = c.gearType;
        door = c.door;
    }

⬇️ 무작정 새로 코드를 작성하는 것보다 기존의 코드를 활용할 수 없는지 고민해야한다.

	Car(Car c) {
    	// Car(String color, String gearType, int door)
    	this(c.color, c.gearType, c.door);
    }
profile
개발공부하는 잠만보

0개의 댓글