05일차 수업내용
1. 객체지향 2. 클래스와 객체 3. 변수의 종류(by 선언위치) |
1. 객체 지향 Object Oriented Programming(OOP)
일반적으로 객체라고 하면 우리 주변의 모든 것을 의미합니다. 물건 하나 하나가 객체가 됩니다. 물건은 자신만의 고유한 특성과 기능을 가지고 있습니다.
프로그래밍에서 객체를 지향한다는 것은 실세계의 객체처럼 특정 클래스마다 그 자신만의 특성과 기능을 담아 구현될 수 있도록 코딩을 하는 것입니다.
1.1. 이렇게 객체지향의 프로그래밍을 하는 이유는?
현실세계에서 객체의 개념은 최신폰을 생각했을 때, 객체의 개념이 없다고 한다면 폰을 만들 때 A부터 Z까지 전부 쌓아올리듯이 순차적으로 해야해서 오래 걸리겠죠? (과거 프로그래밍 이진수로.... 약간 나아간 게 어셈블리어 이후 C 고급언어. 하지만 절차적 프로그래밍= 구조적 프로그래밍)
절차적 프로그래밍은 기능별 세분화, 함수로 각 기능 모듈을 구현합니다.
ex. 가게의 프로그램을 구현하려면 구매업무, 판매업무, 보안업무, 진열업무, 청소업무
각 업무들은 다시 작은 단위 기능으로 판매 -> 대용량판매, 일반고객 대상판매, 계산대업무, ... 더 더 세분화하다가 최소단위기을을 함수로 구현
함수 가져다 써서 복붙 코드재사용 가능은 한데, 유지보수가 너무 힘들어졌어요. 인터넷이 보급되면서 새로운 프로그래밍 방식 요구됐고, 그래서 등장한 게 객체지향~~ (C++, java)
기능보다 프로그램을 구성하는 주체를 파악. 지점, 상품, 사람.
그래고 이 주체들의 상호작용을 프로그램으로 묘사 - 설계와 구현은 상대적으로 어렵지만 유지보수 재사용성 이점.
휴대폰이 갖는 속성과 기능 / 휴대폰 객체 (객체의 설계도, 그것이 바로 클래스다~~)
속성: cpu, ram, 가격, 색상 = 필드, 변수, 속성, property, attribute
기능: 전원, 전화, 문자, 카메라, 인터넷연결, 앨범
하지만 전화기에, 카메라 기능, 메모장 기능, 다이어리 기능 등 기존에 있던 것들을 합친다면 그 시간은 훨씬 단축될 것입니다.
- 프로그래밍에서도 마찬가지입니다. 객체지향 언어를 사용한다는 것은 부품과 같은 개별 기능들을 가져다 쓰면 되기 때문에 코드의 재사용성이 높아지게됩니다.
우리가 Scanner라는 기존의 클래스가 없다면 사용자로부터 입력받는 코드를 일일이 빌드업해야 할 것이기 때문에 그 과정은 더 힘들어지겠죠? 이런걸 API (Application Programming Interface)라고 부릅니다. 쉽게 말해 남이 만든 코드입니다.
- 객체화라는 것은 기능의 분류, 체계화를 하는 과정이기 때문에, 단순히 남이 만든 코드(API)를 사용하는 것 뿐만 아니라, 효율적인 코드 관리를 가능하게 합니다. 객체지향은 Java에서 상속, 다형성, 추상화, 캡슐화등으로 구체화됩니다.
- 기능별로 묶어놓게 된다면, 신뢰성이 높은 프로그램 개발 가능하게 됩니다. 오류발생하면 기능별로 구분이 되어있어 어디서 오류가 났는지 잡기 쉬워지게 됩니다. 자동차가 타이어가 고장난다면 타이어만 갈면 되는 것이지 차를 폐차할 필요는 없게 되는 것입니다.
# 캡슐화 encapsulation : 자바가 지향하는 코드 스타일
# 상속 inheritance
부모가 자손에게 가진것들을 물려주는 것.
# 다형성 polymorphism
상속 관계에서 성립
같은 이름의 메서드가 클래스나 객체에 따라 기능이 다르게 동작하도록 구현되는 것을 말함.
(소리 내기 기능 실행하면 고양이는 야옹 강아지는 멍멍)
절차지향 : 순서대로 진행되는 코드 방식 ==> 급식소 (모든 절차를 거쳐야 함) 맞춤복
객체지향 : 부품처럼 서로 상호작용하며 진행되는 방식 ==> 뷔페 (다이렉트로 갈 수 있음) 기성복
2. 클래스와 객체
2.1. 클래스는 설계도에 해당합니다. 객체를 만들기 위해 객체가 무엇인지를 정의해 놓은 것입니다. ==> 붕어빵 틀/ 자동차를 생산하는 공장/ 여러번 쓰기 위해 생성
클래스 자체는 메모리에 용량을 차지하지 않고 파일의 용량만을 갖게 됩니다.
2.2 객체는 클래스에 의해 실제로 존재하게 되는 실체가 됩니다. ==> 붕어빵 (밭, 크림)/ 자동차
객체는 실제 메모리 공간을 차지합니다.
2.3. 객체와 인스턴스
말하는 입장에 따라 표현만 달라질 뿐 둘다 객체를 의미합니다. 책상위에 내 폰이 있습니다. 누구 건지 모를 때 남들은 폰이 있다고 말하지만, 나는 내 폰이 있다고 말하는 것처럼.
클래스를 통해 만들어진 객체는 해당 클래스의 인스턴스라고 표현됩니다. 그냥 밖에서 보면 객체인 것이죠.
2.4. 객체 (속성 + 기능)
객체는 그만의 특징(속성)과 기능을 갖게 됩니다. 내 폰이 갖는 속성은 안드로이드체제로 돌아가는 삼성폰, 한손에 들어오는 크기, 심플한 블랙, 가벼운 무게, 커브드 곡선화면입니다. 기 폰이 가진 기능은 전화걸기, 문자받기, 사진찍기, 메모하기, 알람울리기, 음악재생 등이 있듯이 말입니다.
이러한 속성과 기능을 "멤버"라 합니다. 속성과 기능은 각각 "변수", "메서드"와 같은 말입니다.
속성 : (멤버)변수, 필드 (값을 가진 변수에 들어갈 수 있는 것. 브랜드, 색상, 사이즈...)
기능 : 메서드 (객체 내에 만들어진 기능) ==> 소괄호가 붙는 것.
main() println()
2.5. 인스턴스(객체) 생성과 사용
순서 : 클래스(설계도 만들기) -> 객체 생성 -> 사용(기능이나 데이터 저장 꺼내오기)
# 클래스 구조
class 클래스명 {
변수(속성, 필드)
메서드
}
* 클래스명은 대문자로 시작, (전체 대문자는 상수?) 숫자로 시작X, 띄어쓰기X,
특수문자 _ $, 패키지안에 이름은 한개만 존재하게.
2.6. 인스턴스 생성
# 선언
클래스명 참조변수명;
Scanner sc; // 변수만 만듬
# 생성 // new 메모리를 점유. (방크기 지정은 필요없음 )
참조변수 = new 클래스명(); // new만 하지 않고 주소를 변수에 저장해줘야
sc = new Scanner(System.in);
# 줄여서
클래스명 참조변수명 = new 클래스명();
Scanner sc = new Scanner(System.in);
* 참조 변수 (레퍼런스 변수) : 객체를 가르키는,
객체의주소(레퍼런스)를 담고 있을 변수
-> 객체 생선 전, 참조변수 먼저 선언만 하면
메모리에 아직 객체가 생성되어 올라간 것이 아니다.
그냥 주소 담을 수 있는 변수만 만들어 놓은 것.
* new : 새로운 클래스 모양의 메모리를 새로 점유시키는 중요한 키워드 (접근할 때 해당 변수로 가져옴. 배열과는 좀 다름) < 11:48
2.7. 객체 멤버 (변수 or 메서드) 에 접근 : 점(.) 연산자 사용 (배열은 new하면 대괄호[방번호]로 접근했지)
sc.nextLine(); 입력받은 한줄을 다 가져오는 메서드() scanner의 변수나 메서드에서 불러옴.
* stack메모리 heap메모리
클래스 == 사용자 정의 데이터 타입
기본형 : 메모리 양이 정해진 것
참조형(클래스) : 개발자가 필요한 만큼 메모리를 직접 지정해서 만든 것.
클래스 : 유사한 특징을 지닌 개체들의 "속성"과 기능을 묶어놓은 집합
객체 : 실제 존재하는 object를 말함.
3. 변수의 종류
: 선언 위치(어디서 변수가 만들어졌느냐)에 따라 변수의 종류와 성질이 달라집니다. 특히 변수의 선언 위치에 따라 유효기간이 달라집니다. 사용하고자 하는 곳에서 변수가 이미 소멸되었다면 쓸 수 없을테니 각 소멸시점을 잘 알아야 잘 쓸 수 있겠쥬~~?
(day01 데이터 타입에 따라 기본형, 참조형 나눈 바 있습니다. 이와는 다른 구별법입니다.)
1) 클래스 변수
- 클래스 안에서 생성
- 이름 앞에 static 붙는다.
- 종류 : 클래스 기본형변수, 클래스 참조형변수
- 특징 : 모든 객체들이 공유하는 변수로 (한개 공간을 만들어 같이 사용. 이 목적에서만 만드는게 좋아)
프로그램에서 가장 먼저 생성됨(메모리에 로딩 시킴. 점유). new로 객체생성을 하지 않아도 바로 사용가능하다. (static아니고서는 new해야 메모리 점유)
- 접근법
클래스명.클래스변수명 (이 형태로 사용하자!인식이 용이)
참조변수명.클래스변수명 (객체생성한 경우에만 가능)
- 유효기간
프로그램 시작 -> 프로그램 종료
2) 인스턴스 변수
- 클래스 안에 생성
- static이 붙지 않는다.
- 종류 : 인스턴스 기본형 변수, 인스턴스 참조형 변수
- 특징 : 각 객체(인스턴스)마다 개별적인 저장 공간을 갖는다.
new 를 한 후 (객체 생성) 메모리에 올라가면 사용이 가능하다. (그렇지 않고서는 사용 불가)
가르키는 참조변수가 없을 경우 가비지컬렉터가 수거해감.(메모리해제)
또는 프로그램 종료시 소멸
- 접근법
참조변수명.인스턴스변수명 t3.power
- 유효기간
new~~(객체생성) --> 링크가 끊겨 GC 가비지컬렉터가 수거해가거나 프로그램이 종료됐을 때
3) 지역변수
- 메서드 안에서 생성된 모든 변수 ( ex. 메인메서드 내부의 변수)
- 종류 : 메서드(, 조건문, 반복문 내)에서 선언된 변수를 가르키며,
메서드 종료시 소멸된다.
# 메모리 로딩 순서 (프로그램 시작)
클래스 영역을 생성
-> static 붙은 애들 로딩
-> static 중 main 메서드 있으면 실행(프로그램마다 하나는 반드시 있는게 일반)
-> new ~ 로 만든 instance들을 차곡차곡 메모리 점유함
| 클래스 범위 만들고
|메인메서드 포함 메모리에 로딩
|main이 있으면 실행
| new객체 생성할때 마다 각각 메모리에 로딩
- 유효기간
: 메서드 안에서 선언시 --> 메서드가 종료 (메모리에서 바로바로 없어지니까 )
'코딩' 카테고리의 다른 글
2022.02.15_7일차_생성자와 this키워드 (0) | 2022.02.21 |
---|---|
2022.02.14_6일차_메서드와 메서드 오버로딩 (0) | 2022.02.20 |
2022.02.10_4일차_다차원배열 (0) | 2022.02.18 |
2022.02.09_3일차_제어문(2)과 배열 (0) | 2022.02.17 |
2022.02.08_2일차_연산자와 제어문(1) (0) | 2022.02.16 |
댓글