티스토리 뷰
객체지향 프로그래밍
(Object Oriented Programming)
+
Object : 단위, 형식
하나의 단위다
단위로 표현할 수 있는 형식이다.
자료형(int,double)같은 것도 구조체,형식이니깐
+클래스(Class) ,객체(Object), 인스턴스(Instance)
카페에서 메뉴판에는 여러 음료와 디저트들이 나열되어 있다.
메뉴판 = 클래스 ,
메뉴판에서 선택한 특정 음료나 디저트를 주문할 때의 그것이 곧 인스턴스
주문에 따라 만들어진 '아메리카노' = 인스턴스
이 인스턴스는 클래스에서 정의된 특징(속성) 과 기능(메소드)을 가지고 있다.
예를 들어 아메리카노(인스턴스) 라면 컵의 크기 , 커피 양, 가격 등의 특징을 가지고 있다.
요약하면 클래스 = 일종의 틀
인스턴스 = 틀을 토대로 만들어진 실제 객체
따라서 인스턴스는 클래스의 구조를 따르면서 각자의 독립적인 특징과 상태를 가진다.
다시 돌아가서
객체 지향 프로그래밍의 정의란 ?
프로그래밍에 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법,,
+ 객체 지향 프로그래밍의 장점 ?
+ 객체 지향 프로그래밍의 특징 ?
+ 객체(or 클래스) 가 무엇인지 ?
=> 모두 객체지향 키워드 5가지와 관련된 내용의 장단점을 알고있는지 묻는 것
객체 지향 프로그래밍의 장점,단점을 간단히 설명해주세요.
장점
- 코드 재사용이 용이합니다
ㄴ 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용가능
- 유지보수가 쉽습니다.
ㄴ 절차 지향 프로그래밍에서는 코드를 수정해야할 떄 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 존재하기 때문에 해당 부분만 수정 가능
- 대형 프로젝트에 적합 합니다.
ㄴ 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를
개발할 떄 업무 분담하기 쉽습니다
단점
- 처리 속도가 상대적으로 느리고,
- 객체가 많으면 용량이 커질 수 있고,
- 설계시 많은 시간과 노력이 필요하기 때문입니다.
*** 면접 활용 ***
객체 지향 프로그래밍의 키워드 5가지를 설명해보세요.
- 클래스 + 인스턴스(객체)
class : 객체를 기술하는 문법이다. (자료형이다)
Object : 단위, 형식 이다.
단위로 표현할 수 있는 형식이다.
자료형(int,double)같은 것도 구조체,형식이니깐
- 추상화
ㄴ 추상화는 클래스를 설계하는 것 자체를 의미합니다.. 공통의 속성이나 기능을 묶어 이름을 붙이는 것입니다.
- 캡슐화
ㄴ캡슐화의 목적은 2가지 인데요.
1. 코드를 재수정 없이 재활용하는 것 과
2. 접근 제어자를 통한 정보 은닉 입니다.
다 제거하고 객체 지향 프로그래밍에서는 캡슐화를 통해 객체가 외부에 노출하지 않아야할 정보 또는 기능을
접근제어자를 통해 적절히 제어 권한이 있는 객체에서만 접근하도록 할 수 있기에 코드의 수정이 일어났을 때
책임이 있는 객체만 수정하면 되기에 영향 범위를 예측하는데 수월해졌습니다.
또, 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 객체 재활용이 원활해졌습니다.
객체 지향 프로그래밍에서 기능과 특성의 모음을 '클래스'라는 '캡슐'에 분류해서 넣는 것이 '캡슐화' 입니다.
- 상속
ㄴ 정의는 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은
자식클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것입니다.
ㄴ 왜쓰는지,, 절차 지향 프로그래밍에서도 '라이브러리'를 통해 남이 짜놓은 소스 코드를 가져와 사용할 수 있습니다.
하지만 내 의도에 맞게 수정하게되면 다른 라이브러리가 되어 버전에 따라 동작하지 않을 수 있고 불필요한 코드의 수정작업을 해야한다..
문제를 해결하기 위해 상속을 도입했다합니다...
- 다형성
ㄴ 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다는 것
ㄴ overriding , oveloading 이 가능하다는 말
* overriding : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것
* overloading : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것
getter , setter 를 사용하는 이유는 무엇인가요?
getter , setter 를 사용하면 메서드를 통해 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한 하거나 조절할 수 있기 때문이다.
1. 보안과 캡슐화 : getter, setter를 사용하지 않으면 해당 필드에 직접 접근할 수 없어 보안과 캡슐화가 보장된다. 마치 집의 문이 없어 외부인이 직접 들어올 수 없고, 반드시 문을 통해 출입해야 하는 것과 유사하다. 만약 직접 접근이 허용된다면 문이 없는 집은 누구나 출입할 수 있는 취약한 상태가 된다.
2. 유연성 : getter , setter 를 사용하지 않으면 필드의 값을 변경하거나 가져오는 로직을 유연하게 제어할 수 있다. 마치 레스토랑에 직접 접근하지 않고, 서빙하는 직원을 통해 음식을 요청하고 제공받는 것과 비슷하다.
3. 의존성 관리 : getter , setter 를 사용하지 않으면 다른 클래스가 해당 클래스의 내부 구현에 의존하지 않아도 된다. 마치 자동차 운전자가 자동차 엔진 내부 작동 원리를 몰라도 운전할 수 있는 것과 비슷하다. 필요한 것은 자동차의 외부 인터페이스(핸들, 페달 등)만 알면 되기 때문에 의존성이 줄어든다.
4. 가독성과 유지 보수성 : getter , setter 를 사용하지 않으면 코드가 간결해지고 가독성이 높아진다. 마치 가게에서 물건을 구매할 때 레지스터에서 바로 결제하고 가져가는 것이 프로세스를 간소화하는 것과 유사하다. 필요한 것을 직접 가져가는 것이 코드를 이해하기 쉽고 유지 보수하기 용이하다.
+ 공부할 때 참고했습니다 https://jeong-pro.tistory.com/95
메소드(Method)
- 기능을 수행하기 위한 코드. 주로 반복적으로 기능을 수행할 때 생성
+ 다른 언어(C++)에서의 함수의 기능과 비슷함.
차이점은 함수는 특정 기능을 수행하는 코드를 묶은 것이고, 메소드는 클래스 내에 포함된 함수라고 할 수 있다
자바는 객체지향 이며 모든 코드를 클래스 내에서 작성하기 때문에 메소드라고 용어를 구분하는 것이 좋다.
// 메소드의 정의 :
[ 수식어 ] 리턴타입 메소드이름( [매개변수1, 매개변수2, ... ] ) { 본문 }
//수식어 종류 : public , private , static , ... - public 생략
//리턴 타입 : 자료타입( int , double, String , class ... ), void(없음)
//매개변수 : 함수 호출시 전달되는 데이터를 저장하는 변수
전달받는 데이터가 없으면 매개변수 선언 생략 가능
//{ 본문 } : 매소드 본체(body). 수행해야 할 기능을 작성
// * 주의 * : 매소드 안에 또 다른 메소드를 만들 수 없음
// static 수식어 : 프로그램이 실행될 때 생성하도록 선언하는 키워드
// static 메소드에서는 static 으로 선언된 메소드만 호출 가능
// 메소드 선언 형식: 매개변수를 가지는 메소드
public static void methodName(ParameterType parameter1, ParameterType parameter2 ...) {
// 메소드 기능 구현
// void 메소드는 일반적으로 기능을 실행하고 특정 값을 반환하지 않음
// 기능을 출력하려면 주로 sysout을 사용
}
// 메소드 선언 형식: 매개변수를 가지고 리턴값이 있는 메소드
public static ReturnType methodName(ParameterType parameter1, ParameterType parameter2 ...) {
// 메소드 기능 구현
// 리턴타입이 있는 메소드는 특정 값을 반환함
// 기능을 출력하려면 반환문(return)을 사용하여 결과를 반환
return returnValue; // 리턴타입에 해당하는 값을 반환
}
result 라는 변수 선언 후 메소드를 담아 출력
문제
1. 국어,영어,수학 점수를 입력받아서 3개의 변수에 저장한다
2. 메소드를 정의하여 입력받은 점수를 출력
3. 메소드를 정의하여 세 과목의 총점을 출력
4. 메소드를 정의하여 세 과목의 평균을 출력
5. 메소드를 정의하여 *평균*에 따른 등급을 출력
점수 출력하는 메소드 , 이름: printScores()
총점을 리턴하는 메소드 , 이름 : calcTotal()
평균을 *리턴*하는 메소드 , 이름 : calcAverage()
등급을 *리턴*하는 메소드, 이름 : selectGrade()
100~90 : 'A' , 89~80 : 'B', 79~70 : 'C', 69미만 : 'F'
* main()에서 총점을 선언해놓고 메소드 변수로 지정해서 사용
* 방법 1 , 방법 2 가 있음
* 방법 2 는 result = 0으로 초기화 해놓고
if문 출력결과에서 result에 담아서 return
주소값 :
아래처럼 'scores' 라는 배열을 선언하면, 배열 요소를 저장할 메모리 공간이 생성되며,
각 요소에 대한 주소값이 존재하게 됩니다.
int[] scores = new int[5];
System.out.println(scores)
여기서 scores는 배열 객체를 가리키는 참조 변수입니다.
System.out.println(scores);를 실행하면 배열 객체의 주소값이 출력됩니다.
메소드 overloading - 그릇은 같은데 대상이 다르게 설계를 한 것
1. 매개변수의 개수가 다르거나
2. 매개변수의 타입이 다른 경우 , 같은 이름으로 정의할 수 있다.
**주의** 메소드의 리턴타입만 다른 경우는 같은 이름으로 메소드를 정의할 수 없음
클래스(Class) : 메소드는 한 번 쓰고 끝, 메소드 보다는 기능이 많음
비유를 들면 class는 붕어빵 틀 , instance는 재료만 다른 실제로 만들어진 붕어빵
만들고자 하는 대상의 상태(속성) 정보들을 " 멤버 변수(필드) " 로 선언하고,
대상이 가져야 할 기능들을 " 메소드 " 로 정의하는,
새로이 만드는 " 데이터 타입 " => 타입이란 틀
아래 예시를 보면 BasicTv 클래스를 만들 때,
Tv가 가져야 할 상태(= 속성 = 성질) 을 " 멤버 변수 " (= 필드 = 프로퍼티) 라고 하고,
Tv 가 가져야 할 기능(전원 on/off , 채널 변경 , 소리 크기 변경 ... )들을 메소드로 구현할 것 을 볼 수 있다.
ClassMain
클래스의 " 인스턴스 "를 " 생성 " 한다
클래스의 이름 변수이름 = new 생성자();
=> instance 를 생성한다
예 ) BasicTv tv = new BasicTv(); // 기본 생성자
기본 생성자를 호출하여 인스턴스를 생성하게 되면
클래스의 멤버 변수들은 기본값으로 초기화됨
- 숫자 (int , double , ... ) 타입의 기본값 : 0 , 0.0 ...
- boolean 타입의 기본값 : false
- 그 외 타입(참조 타입) : null
변수 타입으로 선언할 수 있는 형태
- 기본 타입 변수 : byte , char , int 등. 실제 값을 변수 안에 저장
예 ) int a = 3 , b =10;
- 참조타입 변수 : 배열, 클래스, 인터페이스 등. 주소를 통해 객체 참조
예 ) int[ ] a = new int[3];
오늘의 퀴즈 :
볼륨 up , 소리 최대 4
볼륨 down , 소리 최소 0
선생님 코드
'백엔드 교육과정 > 2월' 카테고리의 다른 글
2024.02.14_JRE,JVM,final 제한자,멤버 변수,지역 변수,static,HW4 (0) | 2024.02.14 |
---|---|
2024.02.13_Class_constructor(생성자), Access(접근 제한), 캡슐화 (0) | 2024.02.13 |
2024.02.06_ 2차원 배열, HW2 (0) | 2024.02.06 |
2024.02.05_Loop 예제 , 배열 (0) | 2024.02.05 |
2024.02.02_Codeup , HW1 (0) | 2024.02.02 |