본문 바로가기

Kosta 교육

[Day7 - JAVA] chap6. 객체지향언어1_1

1. 객체지향언어

  1) 기존의 프로그래밍 언어와 크게 다르지 않음 : 기존 프로그래밍 언어에 몇 가지 규칙만 추가

  2) 코드의 재사용성이 높음 : 새로운 코드 작성 시 기존의 코드를 이용 가능

  3) 코드의 관리가 쉬움 : 코드간의 관계를 맺어 적은 노력으로 코드 변경 가능

  4) 신뢰성이 높은 프로그램의 개발 가능 : 제어자와 메서드를 이용해 데이터를 보호, 코드의 중복을 제거해 불일치 오류 방지 가능

 


2.1  클래스와 객체, 인스턴스

클래스

: 객체를 정의해 놓은 것

: 객체를 생성하는데 사용

 

객체

: 실제로 존재하는 것으로 사물 또는 개념

: 속성과 기능에 따라 사용이 다름

 

객체(object)는 인스턴스(instance)를 포함하는 일반적 의미

 

인스턴스화

: 클래스로부터 인스턴스(객체)를 생성하는 것

 

https://kcode-recording.tistory.com/206

 

[JAVA] 객체지향 프로그래밍(OOP) 기초, 클래스, 객체

객체지향 프로그래밍 : 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법 : 클래스 > 처리 및 데이터 부분을 객체로 생성해 사용 : JAVA, C++, C# 등 대표적 언어 존재 클래스

kcode-recording.tistory.com

https://kcode-recording.tistory.com/79

 

[Java] About 클래스와 객체

[클래스] : 객체의 설계도 또는 틀 (Ex. 붕어빵을 만드는 붕어빵 틀) : 객체를 정의해 놓은 것으로 객체를 생성하는데 사용 : 데이터와 함수의 결합 (구조체 + 함수) * 구조체 : 서로 관련된 여러 데

kcode-recording.tistory.com


2.2 인스턴스 생성과 사용

클래스명 참조변수명; // 객체를 다루기 위한 참조변수 선언
참조변수명 = new 클래스명(); // 객체 생성 후, 생성된 객체의 주소를 참조변수에 저장

ex)
class Main{
    class Tv{
        String color;
        int channel;
        void channelDown{channel--;}
    }
    public static void main(String[] args){
        Tv t;
        t = new Tv();
        Tv t = new Tv(); // 선언과 동시에 생성 가능

        t.channel = 7; // channel에 7 넣기
        t.channelDown(); // channelDown 메서드 실행
        System.out.println(t.channel);
    }
}

2.3 클래스의 또 다른 정의

1) 데이터와 함수의 결합

  • 변수 : 하나의 데이터를 저장할 수 있는 공간
  • 배열 : 같은 타입의 여러 데이터를 저장할 수 있는 공간
  • 구조체 : 타입에 관계없이 서로 관련된 데이터들을 저장할 수 있는 공간
  • 클래스 - 데이터와 함수의 결합(구조체 + 함수)

2) 클래스 사용자 정의 타입

- 프로그래머가 새로운 타입 정의 가능

- 서로 관련된 값을 묶어 하나의 타입으로 정의 가능

class Time{
	int hour;
    int minute;
    int second;
}
// 여러개의 시간, 분, 초를 사용하고 싶을 경우 각각을 선언하여 다르게 사용 가능함
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();

// 시간을 각각 설정 가능
t1.hour = 1;
t2.hour = 2;
t3.hour = 3;

3.1 선언 위치에 따른 변수 종류

인스턴스 변수(instance variable)

: 각 인스턴스의 개별적인 저장 공간으로 인스턴스마다 다른 값 저장 가능

: 인스턴스 생성 후 참조변수.인스턴스명으로 접근 가능

: 인스턴스 생성 시 생성되며, 참조변수가 없을 때 가비지컬렉터에 의해 삭제

 

클래스 변수(class variable)

: 같은 클래스의 모든 인스턴스들이 공유하는 변수

: 인스턴스 생성없이 클래스이름.클래스변수명으로 접근

: 클래스가 로딩될 때 생성, 프로그램이 종료될 때 소멸

 

지역 변수(local variable)

: 메서드 내 선언되며, 메서드 종료 시 삭제

: 조건문, 반복문 블럭 내 선언된 지역변수는 해당 블럭을 벗어나면 삭제


3.2 메서드(method)

메서드란?

: 작업을 수행하기 위한 명령문 집합

: 값을 입력받아 처리하고 그 결과를 돌려주지만, 입력받는 값이 없고 결과를 돌려주지 않을수도 있음

 

메서드 장점 및 작성 지침

: 반복적인 코드를 줄이고 코드 관리 용이

: 반복 수행되는 여러 문장을 메서드로 작성

 

: 하나의 메서드는 한가지 기능만 수행하도록 작성

: 관련된 여러 문장을 메서드로 작성

: 클래스 영역에서만 정의 가능

 

메서드 호출

참조변수.메서드 이름(); // 메서드에 선언된 매개변수가 없는 경우
참조변수.메서드 이름(값1. 값2, ...); // 메서드에 선언된 매개변수가 있는 경우

class MyMath{
	long add(long a, long b){
    	long result = a+b;
        return result;
        //return a+b;
    }
}

3.3 return문

: 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아감

>> 메서드의 블럭이 끝나거나 return을 만나면 메서드가 정상적으로 종료됨

 

* 반환값이 있는 메서드의 경우 return문이 있어야 함

* return문의 개수는 최소화하는 것이 좋음


3.4 재귀호출(recursive call)

재귀호출이란?

: 메서드 내에서 자기자신을 반복적으로 호출하는 것

: 이는 반복문으로 변경 가능하며, 반복문보다 성능이 나쁨

: 하지만, 이해하기 쉽고 간결한 코드 작성 가능

 

// 팩토리얼
long factorial(int n) {
	long result = 0;
	if(n==1) {
		result = 1;
	} else {
		result = n * factorial(n-1);
	}
	return result;
}

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

클래스 메서드(static 메서드)

: 객체 생성 없이 클래스이름.메서드이름() 으로 호출

: 인스턴스 변수나 인스턴스 메서드와 관계없는 작업을 하는 메서드

: 메서드 내 인스턴스 변수 사용 불가 >> 객체 생성이 필요하기 때문에 객체 생성 없이 클래스 메서드를 사용할 경우 에러가 날 수 있음

: 메서드 내에서 인스턴스 변수를 사용하지 않을 경우 static을 붙이는 것을 고려

 

인스턴스 메서드

: 인스턴스 생성 후, 참조변수.메서드이름() 으로 호출

: 인스턴스 변수나 인스턴스 메서드와 관련된 작업을 하는 메서드

: 메서드 내에서 인스턴스 변수, 클래스 변수 사용 가능

 

깃허브 링크 : https://github.com/Khjin06k/kostaJava/tree/main/src/day7/chap6_OOP_1