Java - Object-oriented programming I

2022. 6. 27. 13:07Java

Features of OOP:

1. 코드의 재사용성이 높다.

2.코드의 관리가 용이하다. 

3.신뢰성이 높은 프로그래밍을 가능하게 한다.

   -제어자와 메서드를 이용해 데이터를 보호하고 코드 중복을 제거하여 코드 불일치로 인한 오작동을 방지할 수 있음

 

Class & Object:

Class : 객체를 정의해 놓은 것 ex) 붕어빵 틀

Object : 객체를 생성하는데 사용됨 ex) 붕어빵

 

Object & Instance:

instantiate : 클래스로부터 객체를 만드는 과정

instance : 어떤 클래스로부터 만들어직 객체

 

Element of Object - Property & Function

Property -> variable ex) int channel

Function -> method ex) channelUp(){...}

class Tv{
	//properties
	String color;
	boolean power;
	int channel;
    
	//methods
	void power(){power =! power;}
	void channelUP(){channel++;}
	void channelDown(){channel--;}
    }

 

How to Create and Use Instance

: 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.

class TvTest{
	public static void main(String[] args){
    	Tv t; //참조변수 선언
        t = new Tv(); //인스턴스가 메모리 공간에 생성됨
        t.channel = 7;
        t.channelDown();
        System.out.println(t.channel);
        }
 }

Array of Objects

Tv[] tvArr = new Tv[3]; //객체 배열 생성

// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = newTv();
tvArr[1] = newTv();
tvArr[2] = newTv();

//for문을 사용하는 경우
for(int i = 0; i < tvArr.length; i++){
	tvArr[i] = new Tv();
    }

 

Variable & Method:

Variable

Types of Variables

멤버 변수: class 영역에 선언된 변수 - class variable, instance variable

1. instance variable: static X

   - 인스턴스는 독립적인 저장 공간을 가지므로 서로 다른 값을 가질 수 있다.

     인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언한다.

2. class variable: static O

   - 인스턴스마다 독립적인 저장 공간을 갖는 인스턴스 변수와는 달리, 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.

     한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성인 경우, 클래스 변수로 선언해야한다.

(클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지되며, public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 '전역변수(global variable)'의 성격을 갖는다.)

3. 지역 변수(local variable) : method 안에 선언된 변수

 

Method

Merits of Methods:

1. 높은 재사용성(reusability)

2. 중복된 코드 제거

3. 프로그램의 구조화

 

How to Create and Use Method

methods are consists of header and body. 

method's header is consists of method name, parameter declaration and return type.

method's body: 함수를 호출했을 때 수행될 문장들

+body must include return statement if it is not a void type.

int add(int x, int y){
	int result = x + y;
    return result; //결과를 반환
    }

Call of Methods

public static void main(String args[]){
	int result = add(3,5);
    }

매서드의 실행흐름:

같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만 static 매서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.

 

Memory Structure of JVM(Java Virtual Machine)

1. 매서드 영역(method area)

: 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수(class variable)도 이 영역에 함께 생성된다.

2. 힙(heap)

: 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스변수(instance variable)들이 생성되는 공간이다. 

3. 호출스택(call stack or execution stack)

: 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.

 

Primitive type parameter & Reference type parameter

primitive type (기본형 매개변수) : 변수의 값을 읽기만 할 수 있다. (read only)

reference type (참조형 매개변수) : 변수의 값을 읽고 변경할 수 있다. (read & write)

 

Class method (static 메서드) & Instance Method

클래스 메서드 : 클래스 변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하다.

인스턴스 매서드 : 반드시 객체를 생성해야만 호출할 수 있다.

 

클래스를 정의할 때, 어느 경우에 static을 사용하여 클래스 메서드로 정의해야할까?

 

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

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

 

1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.

2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.

3. 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 있다.

4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

 

Overloading

definition: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의 하는 것

conditions:

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

 

+)가변인자(varargs)를 선언한 메서드를 오버로딩하면, 메서드를 호출했을 때 구별되지 못하는 경우가 발생할 수 있기에 주의해야한다.

 

Constructor

definition: 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.

conditions:

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 값이 없다.

class Card{
	Card(){ //매개변수가 없는 생성자
    ...
    }
    Card(String k, int num){ //매개변수가 있는 생성자
    ...
    }
}

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

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

Initialization of variables

: 맴버 변수는 초기화하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고 사용해도 되지만, 

지역변수는 사용하기 전에 반드시 초기화해야 한다.

class InitTest{
	int x;		//인스턴스 변수
    int y = x;	//인스턴스 변수
    void method1(){
    	int i;		//지역변수
        int j = i;	//에러. 지역변수를 초기화하지 않고 사용
        }
    }

 

 

*References

남궁 성, ⌜자바의 정석⌟, 2016.1.27

 

'Java' 카테고리의 다른 글

[Java] 변수  (0) 2024.02.22
[Java] 자바의 특징  (0) 2024.02.22
Java 버전 바꾸기 Mac M2 air  (1) 2023.12.26
Java - Object-oriented programming II  (0) 2022.07.11
Java - Array  (0) 2022.05.23