세상에... 오랜만에 하는 복습이다. 열심히 공부하시라구요!

 


 

객체지향 파트 시작! 중요★

객체 지향 언어

코드의 재사용성을 높이고 유지보수가 용이함

 


 

1. 메소드

메소드

이름 뒤에 소괄호가 있는 것

단, 키워드 뒤에 소괄호는 메소드가 아니다.(ex. if, while, for, switch, ...)

 

       f              (x)           =     2x+1;

메소드이름   매개변수   대입   리턴값

 

* 매개변수는 외부(호출한 곳)에서 전달한 값을 받아서 메소드로 오게 해주는 중간다리 역할을 한다.

 

- 메소드의 목적

   ① 코드의 재사용(특정성을 부여해서는 안된다.)

   ② 소스코드 간결화로 이해하기 쉬워진다.

   ③ 모듈화(하나의 코드/로직을 여러 개의 메소드로 분리할 경우 유지보수가 용이하다.)

 

 

메소드 선언

① 리턴타입 ②메소드명 (③자료형 매개변수1, 자료형 매개변수2, ...){

          ④ 호출 시 실행할 문장

          ⑤return 리턴값;

 

메소드는 선언부(①②③)와 구현부(④⑤)로 이루어져 있다.

① 리턴 값이 있다면 리턴 값의 자료형을 선언, 리턴 값이 없다면 void를 선언(리턴 값과 리턴 타입의 자료형이 일치해야함★)

② 동사로 작성 (ex. eat(), sum())

③ 외부에서 전달받아야 하는 값이 있다면 자료형과 순서에 맞게 선언해준다. 생략이 가능하지만, 생략 시 외부에서 값을 전달받을 수 없게 된다.

④ 생략이 가능하며, 메소드의 기능을 구현하는 로직(알고리즘)을 작성한다.

⑤ 리턴 값은 메소드의 연산처리 결과값이다. 리턴 타입이 void일 때 생략이 가능하다.(컴파일러가 자동추가) 하지만 리턴타입이 있을 경우 절대 생략 불가

return을 만나면 메소드를 종료하고 다시 호출한 곳으로 되돌아간다.

 

- 메소드의 선언 순서 예시. 두 정수의 곱셈 메소드 선언

메소드 이름을 생각하고 소괄호와 중괄호를 붙인다.

    multyply(){}

 

어떤 매개변수를 받아올지 생각한다.(두 정수를 받기 위해 매개변수 두 개 필요)

    같은 타입의 매개변수를 여러 개 받아와도 자료형은 각각 써줘야 한다.

    multyply(int num1, int num2){}

 

 

실행할 문장 작성

    multyply(int num1, int num2){

          int result = num1*num2

    }

 

외부로 반환할 리턴값을 작성한다.

    multyply(int num1, int num2){

          int result = num1*num2

          return result;

    }

리턴 값을 통해 선언부의 리턴 타입을 결정한다.

***재사용성과 유지보수를 위해 하나의 메소드는 한 가지 기능만 수행하도록 작성한다.(리팩토링)***

 

 

메소드 사용

메소드는 클래스 내부에 있으므로 해당 메소드가 속해 있는 클래스 타입으로 먼저 참조변수를 만들어 줘야 한다.(객체화 필수)

 

클래스명   참조변수명   =   new   클래스명();

참조변수명.메소드명(); > 매개변수가 선언되지 않은 경우

참조변수명.메소드명(값1, 값2, ...); > 매개변수가 선언된 경우

 

메소드에 매개변수가 선언된 경우에는 개수와 타입에 맞게 값을 넘겨주어야 한다.

리턴 타입이 void일 경우, 리턴 값이 없기 때문에 사용 시 그냥 호출해도 ok. 만약 리턴 타입이 있을 경우, 사용 시 메소드 통째로가 "리턴 값"이기 때문에 값을 담을 변수를 만들어줘야 한다.

메소드가 수행 중 return을 만나면 실행을 종료하고 자신을 호출한 곳으로 돌아간다.

 

 

메소드 예제

'f(x)=2x+1', '이름 10번 출력' 메소드를 선언 후, Ex1_Method ex1 = new Ex1_Method();로  불러와서 사용.

ex1.sayMyName("홍길동"); > 홍길동이 10번 출력

int result = ex1.f(10); > (2*10 + 1) 과정을 거쳐 21 출력

리턴 값의 타입, 선언부 리턴 타입, 리턴 값을 담을 변수 타입이 모두 일치해야 한다. 위 예제는 int로 전부 일치

 

 

메소드 실습

① 1부터 10까지 for문으로 반복 출력하는 메소드를 만들어준다. 이때 지문대로 system.out.println()으로 선언하고, 리턴 값이 없기 때문에 void를 선언한다. 

② 1부터 10까지 더한 합을 구하는 문장을 만들고 sum에 리턴 값을 받는다. 리턴 값이 int이므로 리턴 타입도 int 

③ 이름을 n번 출력하는 메소드. n번 값을 받아야 하므로 매개변수 int cnt를 만들어준다. for문을 통해 n번 반복 출력문을 만들고 리턴 값이 없으므로 void 선언

④ 2번과 동일하지만 n번 값을 받을 매개변수 int num을 만들어준다. 

⑤ 세 개의 정수를 받아야 하므로 int 타입의 매개변수 세 개를 만들어준다. 같은 타입의 매개변수여도 int를 모두 붙여준다(int num1, int num2, int num3). 리턴 값이 int이므로 리턴 타입도 int

⑥ 두 개의 정수를 받아야 하므로 int 타입의 매개변수 두 개를 만들어준다. 실수로 만들어줘야 하므로 리턴 값과 리턴 타입 모두 double로 받는다.

⑦ 문자열과 문자를 받을 매개변수를 각각 만들어준다(String str, Char c). 갯수를 세어야 하므로 count 변수를 초기화해주고, for문을 문자열의 길이만큼 반복한다. charAt()를 통해 문자열(str)을 하나씩 문자로 불러와 c와 비교. 리턴 값인 count는 int이므로 리턴 타입도 int

⑧ 배열과 n번 값을 받을 매개변수를 각각 만들어준다(int[] arData, int idx). 사용자가 볼 땐 두번째 자릿값이어도, 인덱스는 0번부터 시작하므로 1번자리가 된다. 따라서 arData[idx-1]이 되어야 한다. 리턴 값은 int이므로 리턴 타입도 int

8번의 메소드 사용을 보면, for문을 통해 배열에 5개의 숫자를 넣어주고 세번째 자리값을 출력했다. 인덱스 상에서는 두번째 자리값.

 


 

2. 클래스

클래스 Class(반)

서로 관련있는 요소들을 추상적이게 묶어 놓은 틀

여러 변수들과 메소드들을 한 번에 관리할 수 있다.

 

- 클래스 목적

공통요소를 매번 선언하는 작업이 불편하기 때문에 클래스에 선언하여 필드에 공통요소를 한 번만 선언하고, 클래스를 사용할 때 클래스 타입의 객체를 사용한다. 그래서 하나의 클래스 타입으로 여러 개의 "객체"를 생성할 수 있다.

(하나의 제품설계도로 여러 개의 제품을 만들 수 있다.)

 

- 객체화

클래스는 추상적인 개념이라서 바로 사용할 수 없기 때문에 필드들을 구체화시킬 대상이 필요하다. 그래서 객체화를 통해 구체적인 "객체(instance variable)"를 만든다.

 

객체 = 속성(변수) + 기능(메소드)

Car = 속성(색상, 브랜드, 가격) + 기능(시동켜기, 시동그기, 클락션 울리기 등)

 

추상적인 개념인 클래스를 객체로 구체화해서 만드는 작업을 객체화(instance화)라고 한다.

 

클래스 ------------> 객체(인스턴스)

            객체화

 

객체 생성을 통해 안에 있는 속성(변수)과 기능(메소드)를 사용할 수 있다.

(설계도를 통해 제품을 생성해 제품을 사용한다.)

 

- 타입

클래스를 통해 객체가 만들어지기 때문에 객체의 타입은 해당 클래스 타입이다.

Car         firstCar;

클래스명  객체명;

 

- 주어

클래스명의 첫 글자는 항상 대문자로 적는다.

 

 

클래스 선언

다른 클래스 외부에서 선언한다.

class 클래스명{

          필드(변수 선언, 메소드 선언)

          실행문(for, sysout, ...) x

}

 

 

클래스 사용(객체 생성과 사용)

객체화 : 클래스는 추상적인 틀이기 때문에 먼저 객체를 만들어서 객체화시킨다.

객체 생성을 통해 안에 있는 변수와 메소드를 사용한다.

 

①클래스명 ②객체명 = ③new 클래스명(); 

④객체명.변수

⑤객체명.메소드();

 

① 객체를 만들 클래스 타입

② 객체를 다룰 참조변수로 주소값을 저장한다

③ 객체를 생성하며 주소값을 반환한다. ***이때 클래스명()은 생성자를 호출하는 의미

④ 만들어진 객체를 통해 안에 있는 변수를 사용한다.

⑤ 만들어진 객체를 통해 안에 있는 메소드를 사용한다.

new 연산자를 통해 메모리에 올라가면 주소값을 부여받는다. 그 때 할당된 주소값은 참조변수에 저장된다. 따라서 참조변수를 출력하면 주소값이 나타난다.

 

클래스 선언(설계도) > 객체생성(제품만들기) > 객체사용(제품사용)의 순서

 

 

생성자

new 연산자를 통해 객체(인스턴스)를 생성할 때 반드시 호출되는 일정의 메소드

객체 생성 시 객체(인스턴스 변수)를 초기화하기 위해 사용한다.

 

클래스명(자료형 매개변수1, ...){

          객체 생성 시 수행할 코드

          주로 객체의 변수를 초기화하는 코드

}

 

이름이 클래스 이름과 같아야 하고 리턴 타입이 없다.(void도 붙이지 않는다.)

생성자는 메소드와 똑같은 기능을 가지고 있지만, 리턴을 할 수 없기 때문에 메소드라고 부르지 않는다.

클래스는 무조건 생성자를 1개 이상 가지고 있어야 한다. 만약 생성자를 만들지 않았을 경우, 컴파일러가 자동으로 "기본생성자"를 만들어준다(생략가능). 하지만 직접 생성자를 선언할 경우, 생성자가 하나 이상 있기 때문에 기본 생성자를 만들어 줄 필요가 없다.

 

- 기본 생성자란?

매개변수가 없는 생성자

생성자가 하나도 없을 경우 컴파일러가 자동으로 추가

기본생성자는 반드시 작성하는 것이 좋다.

 

 

this

객체(인스턴스) 자기 자신을 의미

한 클래스 필드에서 여러 객체를 다루어야 하는데, 만약 여러 개의 객체가 접근한다면 어떤 객체가 필드에 접근하는지 알 수 없다. 그래서 this를 통해 필드에 접근한 객체가 누구인지 알려준다. 이때 접근한 객체가 가지고 있는 필드의 주소값을 this라는 변수에 담을 수 있으며 자동으로 담기게 된다. 또한 지역변수와 전역변수를 구별하는 용도도 있다.

 

 

클래스 예제

클래스와 메소드 생성 후 사용까지 예제

 

 

클래스 실습

728x90

+ Recent posts