HAZEL

[ CH02. 객체지향 입문 ] 객체 , 함수와 메서드, 인스턴스, 힙 메모리, 생성자 , 참조자료형, 접근 제어 지시자와 정보 은닉, this 본문

PROGRAMMING/Java

[ CH02. 객체지향 입문 ] 객체 , 함수와 메서드, 인스턴스, 힙 메모리, 생성자 , 참조자료형, 접근 제어 지시자와 정보 은닉, this

Rmsid01 2021. 3. 29. 13:33

CH02. 객체지향 프로그래밍 

: 패스트 캠퍼스 강의를 공부하고 정리한 내용입니다.

 

 

01. 객체와 객체 지향 프로그래밍


1. 객체 ( Object )

: 의사나 행위가 미치는 대상, 구체적 추성적 데이터의 단위

 

2. 절차지향 프로그래밍

: 시간의 흐름에 따른 프로그래밍  ex , C언어

 

3. 객체지향 프로그래밍

: 관계를 가지고 프로그래밍하는 것. ex, C++ , JAVA 등

 

4. 객체 지향 프로그램 구현 방법

: 객체를 정의하고, 각 객체 제공하는 기능을 구현하고, 그 객체가 제공하는 기능들 간의 소통을 통해 객체간에 연결 구현

 

- 클래스는 대문자로 시작, 자바 파일에 클래스는 여러개 있을 수 있지만, public클래스와 하나이고, 이름은 java파일과 동일해야함.

 

package ch02;

// public 은 어디서든 사용가능하다 ! 라는 개념 
// 클래스가 여러개일 수 있지만, public 은 하나여야한다. 
public class Student {

    int studentNumber ;
    String studentName;
    // String - 기본 자료형이 아니라, 자바에서 제공하는 클래스
    // 문자열 길게 사용할 때 사용하는 클래스
    int majorCode;
    String majorName ; // 이런것을 멤버 변수라고함
    int grade;
}

 

02. 함수와 메서드


1. 함수 ( function )

: 하나의 기능을 수행하는 일련의 코드, 구현된 함수를 호출하고 기능이 끝나면 제어가 반환됨 

: 하나의 기능을 구현하면, 다른 곳에서 반복해서 같은 코드를 작성하지 않아도 되기 때문에 좋음 

 

2. 함수를 정의하는 방법

: 함수 이름, 매개변수 , 반환 값, 함수 몸체 

- 수행만 하고 반환을 안하는 경우, int 대신에 void 를 사용하면 됨.

// 함수 이름과 매개 변수 ( 함수 몸체에서 사용되는 변수 )
    int add (int num1, int num2){
        int result ;
        result = num1 + num2 ;
        return result  // 반환값 

 

3. 함수 호출과 스택 메모리

스택 : 함수가 호출될 때 지역 변수들이 사용하는 메모리 , 함수의 수행이 끝나면 자동으로 반환되는 메모리

 -> 함수안에 사용하는 값 ( 지역 변수 ) 

 

: main 에서 각 함수를 호출하면, 그 함수에 해당하는 지역변수를 위한 메모리 공간이 만들어지고, 그 함수가 다 수행되면 그 메모리는 사라진다.

 

4. 메서드 ( method )

: 객체의 기능을 구현하기 위해서 클래스 내부에 구현되는 함수 = 멤버 함수 ( member function )

: 메서드를 구현함으로써, 객체의 기능이 구현됨. 

 

* 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현

 

03. 인스턴스 생성과 힙 메모리 


1. 인스턴스 ( instance )

: 클래스는 객체의 속성을 정의하고, 기능을 구현하여 만들어 놓은 코드 상태 

: new 키워드  -> 인스턴스 생성 

 

2. 힙 메모리

: 생성된 인스턴스는 동적 메모리 ( heap memory )에 할당됨 

 

3. 참조변수, 참조 값

- jvm 이 주는 가상 주소를 할당 받게 된다.

System.out.println(studentKim);
//ch04.Student@1540e19d

 

4. 용어정리

a. 객체 : 객체 지향 프로그래밍의 대상, 생서된 인스턴스

b. 클래스 : 객체를 프로그래밍 하기 위해 코드로 정의해 놓은 상태

c. 인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태

d. 멤버 변수 : 클래스의 속성, 특성 

e. 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수

f. 참조변수 : 메모리에 생성된 인스턴스를 가리키는 변수

g. 참조 값 : 생성된 인스턴스의 메모리 주소값

 

04. 생성자 ( constructor )


1. 생성자 

: 기본 문법  : < class_name > ([<argument_list]) {[<statements]}

: 객체를 생성할 때 - new Student() ; 객체를 생성할 때만 호출.

: 생성자는 반환값이 없고, 클래스의 이름과 동일함.

: 대부분의 생성자는 외부에서 접근 가능하지만, private으로 선언할 수 도 있음.

 

2. 기본 생성자 ( default constructor )

: 클래스에 반드시 적어도 하나 이상의 생성자가 존재. 

 생성자를 클래스에 구현하지 않아도, new 키워드와 함께 생성자 호출할 수 있음. 

 생성자를 안만들면, 컴파일러가 기본 생성자를 만들어준다. 

  public Student(){} - 매개변수도 없고, 구현부도 없음 

 

3. 생성자 오버로딩 ( overloading )

: 생성자 이름을 동일하게 여러개 만드는 것. 사용자의 편리함. 

 

 

05. 참조 자료형 변수


1. 참조 자료형 

 

- 변수의 자료형의 종류

  a. 기본 자료형 : int, long, float, double 등 

  b. 참조 자료형 : String, Date, Student 등 

 

: 변수의 자료형, 클래스형으로 변수를 선언해야 한다. 

: 기본자료형은 사용하는 메모리의 크기가 정해져있지만, 참조자료형은 클래스에 따라 다름 

 

 

06. 접근 제어 지시자와 정보 은닉


1. 접근 제어 지시자 ( access modifier )

: 클래스 외부 클래스에서 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 정하는 키워드

 

- private : 같은 클래스 내부에서만 접근 가능 < 외부클래스 , 상속클래스에도 접근 불가능 >

  : 멤버 변수의 오용을 예방할 수 있게 된다. 

  ex, month = 100 ;  와 같은 것을 예방해줌

 

- 아무것도 없음 ( defalut ) : 같은 패키지 내부에서만 접근 가능 

   -> 쓰고싶다면, import 를 사용해서 접근가능 

 

- protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 불가능

   -> 하위 클래스가 상위 클래스에 접근 가능.

 

- public : 클래스 외부 어디서나 가능함 

 

2. get() / set() 메서드

: private로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공

: get() 메서드만 제공되는 경우를 read-only 필드라고 말함

 

3. 정보은닉 ( information hiding )

: private 으로 제어한 멤버변수도 public 메서드가 제공되면 접근 가능하지만, public으로 공개되었을 때보다 private 일때, 각 변수에 대한 제한을 메서드에서 제어할 수 있다. 

: 정보 은닉으로 인해, 객체의 오류를 방지할 수 있다.

 

4. 정보 은닉을 활용한 캡슐화 ( encapsulation )

: 필요한 정보와 기능만 외부에 오픈함. 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만 제공 

 

07. this 

: 객체 자신을 가리킴


1. this가 하는 일

a. 인스턴스 자신의 메모리를 가리킴.

  -> 클래스 내에서 참조 변수가 가지는 주소 값과 동일한 주소 값을 가지는 키워드 

b. 생성자에게 또다른 생성자를 호출할 때 사용

  -> 클래스에 생성자가 여러 개 인경우, this를 이용하여 생성자에서 다른 생성자를 호출 할 수 있음

  -> 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸수 없음 

public class Person {

	String name;
	int age;
	
	public Person() {
		this("이름없음", 1);
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}

 

c. 자신의 주소(참조값) 반환 함

    // 자신의 주소를 반환하는 this
    public Person getPerson(){
        return this;
    }

    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "james";
        p1.age = 37;

        Person p2 = p1.getPerson();
        System.out.println(p1);
        System.out.println(p2);
    }