객체지향 프로그래밍 기초

Nak Jun Choi·2022년 11월 3일

클래스와 객체

Class

  • 객체를 정의한 설게도 또는 틀이다.

  • 클래스는 객체를 생성하는데 사용되며, 반대로 객체는 클래스에 정의되고 설게된 내용 그대로 생성된다.

  • 클래스는 객체를 생성하는 데 사용되는 하나의 틀이다.

객체

  • 클래스를 통해 생성된 객체를 해당 클래스의 인스턴스(instance)라고 부른다. 또한 클래스로부터 객체를 만드는 과정을 인스턴스화(instantiate)라 부른다.
  • 객체는 모든 인스턴스를 포괄하는 넓은 의미로 쓰이는 편이고, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조한다.
  • 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

클래스의 구성요소와 기본 문법

  • Class 클래스명{}
  • Ex).
	int x = 3; // 필드
    void printX(){} // 메서드
    ExampleClass{} // 생성자
    class ExampleClass2{} // 이너 클래스
}
  • 이 중 필드, 메서드, 이너 클래스는 클래스의 멤버(member)라고 부른다.
  • 필드 -> 클래스가 가지는 속성(state)
  • 클래스 -> 클래스의 기능(behavior)

객체란?

  • 객체는 속성과 기능 두 가지 구성요소로 이루어져 있다.
  • 객체의 생성은 new 키워드를 사용해서 생성할 수 있다.
  • 객체를 생성한 후에는 포인트 연산자(.)를 통해 해당 객체의 멤버에 접근이 가능하다.

객체의 생성

  • 객체의 생성
    클래스명 참조_변수명 = new 생성자();

  • new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미를 가지고 있다.

  • 여기서 참조 변수는 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 가르킨다.

  • 클래스의 객체를 생성한다는 것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.

  • method Area = class Area = Static Area

  • 메소드 영역

    • 어떤 메소드가 호출되려면, 그 메소드를 갖고 있는 클래스 파일을 찾아서 메모리에 로딩 되어야한다.
    • 클래스 파일의 바이트 코드가 로드되는 곳이다.
    • 메인 메소드에서 사용하는 클래스와 static 변수들이 로드 된다.
  • 스택 영역

    • 스택 영역에는 지역변수와 매개변수가 저장된다.

    • 지역변수 = 로컬변수(Local variable), 매개변수 = 파라미터(Parameter)

    • 로컬변수와 매개변수의 특징은 선언된 그 블록 안에서만 유효만 변수들이다.

  • 힙 영역

    • new 키워드를 통해 생성된 인스턴스 변수가 놓인다.
    • 힙 영역에 보관되는 메모리는 메소드 호출이 끝나도 사라지지 않고 유지된다.(가비지 컬렉터에 지워질때까지 혹은 JVM이 종료될때까지.)
  • 인스턴스를 별도의 힙 영역에 할당하는 이유는 인스턴스의 소멸방법과 소명시점이 지역변수(스택에 할당되는)과는 다르기 때문이다.

  • 참조 변수들은 실행될 때마다 많은 데이터들을 스택메모리 영역에 뒀다 뺐다 하는게 매우 비효율적이므로, 힙 영역에 그 내용(진짜 값)이 저장되고, 스택 메모리에는 간단하게 그 주소만 저장되는 것이다.

  • 정리하자면 스택 영역의 지역변수들은 메소드가 호출되고 끝이나는 프로그램의 실행 흐름에 관여하는 것들이고 힙영역의 인스턴스들은 지역변수가 참조하고 있는 실제의 값들을 가지고 있다.

객체의 활용

  • . 포인트 연산자의 의미는 '해당 위치에 있는 객체 안을 보세요'라는 뜻을 가지고 있다.
  • 기본적인 문법
    ex). 참조 변수명. 필드명 // 필드값 호출하기  
         참조변수명.메소드명 // 메서드 호출하기 

필드와 메서드

필드

  • 클래스에 포함된 변수를 의미하는 것으로 객체의 속성을 정의할 때 사용된다.
  • 자바에서 변수는 크게 세 가지로 구분될 수 있다.
    • 클래스 변수 (Class Variable)
    • 인스턴스 변수 (Instance Variable)
    • 지역 변수(Local Variable)
  • 이 중 우리가 필드라 부르는 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구본될 수 있다.
  • static 키워드가 함께 선언된 것 -> 클래스 변수이며 그렇지 않은 것은 인스턴스 변수이다.
  • 이 세 가지 유형의 변수는 다른 유효 범위(Scope)를 가지게 된다.
  • 인스턴스 변수는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자()를 통해 인스턴스가 생성될 때 만들어진다.
  • 클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.
  • 한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에 주로 static 키워드를 사용하여 클래스 변수를 선언하게 된다.
  • 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않아도 클래스명.클래스변수명 을 통해 사용이 가능하다.(메모리 구조에서 메소드처럼, 클래스 변수 또한 클래스 영역에 저장되어 그 값을 공유하기 때문에 가능하다.)
  • 지역 변수는 메서드 내에 선언되며 메서드 내 {}블록에서만 사용이 가능한 변수이다.
  • 지역 변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더 이상 사용할 수 없게 된다.
  • 지역변수와는 다르게 필드 변수는 직적접으로 초기화를 실행하지 않더라도 강제로 초기화가 이루어진다.
    • 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화된다.
    • 스택 메모리는 강제로 초기화되지 않으므로 지역 변수가 선언시 반드시 초기화를 실행해주어야 한다.
  • 데이터를 저장하기 위한 역할을 담당하며 생성자와 메소드 밖에서 사용한다.

Static 키워드

  • static.멤버명 로 사용한다.
  • 인스턴스 생성 없이도 static.멤버명으로 사용이 가능하다.
  • 인스턴스는 heap 메모리에 생성되고 독립적인 저장공간을 가진다.
  • 반면 정적 멤버는 클래스 내부에 저장공간을 가지고 있기 때문에 객체 생성 없이 곧바로 사용할 수 있다.
  • 정적 필드는 객체 간 공유 변수의 성질이 있다.
  • 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다.
  • 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있다.

메서드(Method)

  • 메서드는 특정 작업을 수행하는 일련의 명령문들의 집합을 의미한다.

  • 메서드는 메서드 시그니처(method signature)와 몸통에 해당하는 메서드 바디(method body)로 구분할 수 있다.

자바제어자 반환타입 메서드(매개변수){ // 메서드 시그니처
메서드 내용 // 메서드 바디
}
  • 관례적으로 메서드명은 소문자로 표기한다.
  • 메서드 반환 타입이 void가 아닌이상 반드시 return문이 존재해야 한다. 결과값은 반환타입과 일치하거나 자동 형변환이 가능해야 한다.

메서드의 호출

  • 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야한다. 포인트 연산자.를 통해 메서드를 호출할 수 있다.
  • 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지않고도 서로를 호출할 수 있다.
  • 메서드 ()안에 넣어주는 입력 값을 인자(argument)라고 하는데 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다. 그렇지 않으면 오류가 발생한다!

메서드 오버로딩(Method Overloading)

  • 메서드 오버로딩이란? : 하나의 클래스안에 같은 이름의 메서드를 여러개 정의하는 것을 의미한다.
  • 자바는 메서드의 이름 또는 매개변수의 타입이 다르면 다른 메서드라고 인식한다.
  • 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것이 아니다. 메서드 오버로딩의 2가지 조건이 있다.
    • 같은 이름의 메서드명을 써야한다.
    • 매개변수의 개수나 타입이 다르게 정의되어야 한다.
  • 리턴 타입은 오버로딩을 성립하는 데에 영향을 주지 못한다.
  • 메소드 오버로딩의 장점은 하나의 메서드로 여러경우의 수를 해결할 수 있다.
profile
HelloWorld

0개의 댓글