월루를 꿈꾸는 대학생
ch 6-1 객체지향 본문
1. 객체지향언어
1.2 객체지향 언어
- 코드의 재사용성이 높다 // 기존 코드 이용
- 코드의 관리가 용이하다 // 관계를 이용
- 신뢰성 높은 프로그래밍 가능 // 제어자와 메서드 이용 중복을 제거
재사용성 유지보수 중복된 코드의 제거
2. 클래스와 객체
2.1 클래스와 객체의 정의와 용도
클래스 정의 : 클래스란 객체를 정의해 놓은 것
클래스의 용도 : 클래스는 객체를 생성하는데 사용
객체의 정의 : 실제로 존재하는 것 // 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차
무형의 객체 : 수학 공식 , 프로그램 에러 등
ex_ tv 설계도 (클래스)는 tv (객체 )를 정의 한것이며 tv(객체)를 만드는데 사용
즉 클래스는 설계도 객체는 이 클래스를 활용한 생산물
** 클래스로 객체 생성이유
- 설계도만 잘 만들어 놓으면 제품은 알아서 좋은 제품이 나오니까 고민할 필요없이 설계도대로만 만들면 되니까!
2.2 객체와 인스턴스
인스턴스화 -> 클래스로부터 객체를 만드는 과정 즉 객체를 생성하는 과정
2.3 객체의 구성요소 - 속성과 기능
객체는 속성과 기능의 집합
객체가 가지고 있는 속성과 기능을 멤버라고 칭함
속성 : 멤버변수 , 특성 , 필드, 상태 // 변수
기능 : 메서드 , 함수, 행위 // 함수
2.4 인스턴스의 생성과 사용
- 클래스를 만들었다 : 그저 설계도를 만들었을 뿐 무슨 기능을 하는것은 아님... 종이쪼가리니까
즉 이 종이 설계도를 가지고 인스턴스를 만들어야 쓸 수 있다
클래스명 변수명; // 클래스 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명() ; // 객체를 생성 후 해당 주소를 참조변수에 저장
Tv t;
t = new Tv();
Tv t;
- Tv 의 클래스 타입 참조변수 t를 선언
- 메모리 사엥 t를 위한 공간이 마려되고 아직 아무런 것도 없는 상태
t = new Tv();
- new 연산자에 의해 tv클래스의 인스턴스가 메모리 빈 공간에 생성
- 해당 멤버변수들 즉 변수들은 default 값으로 초기화
- 대입 연산자 = 을 통해 해당 인스턴스의 주소를 참조변수t가 가르키게 됨 즉 이를 통해 인스턴스에 접근이 가능하기에 참조변수는 무조건 필요하다
- new를 통해 그 클래스의 인스턴스를 메모리 상에서 새로 만든다. 참조변수 t는 그저 그 인스턴스의 주소를 가르킬 뿐 인스턴스에 어떤 영향을 미치는 것은 아니다
t.channelDown();
- t = new Tv(); 해당 선언으로 이미 참조변수 t가 인스턴스를 가르키고 있기에 인스턴스 Tv의 기능을 사용할때
참조변수.method의 형식으로 기능 사용 가능
인스턴스는 참조변수를 통해서만 다룰 수 있으며 참조변수의 타입은 인스턴스의 타입과 일치해야한다
참조변수가 없다면 인스턴스를 사용할 수 없고 사용할 수 없는 인ㄴ스턴스는 삭제된다
같은 클래스(설계도)로 생성되었더라도 각 인스턴스의 속성(멤버변수 , 변수)는 서로 다른 값을 유지할 수 있으며 메서드의 내용은 모든 인스턴스에 대해 동일하다
같은 설계도에서 나온 제품이라도 현재 상태는 제품에 따라 다를 수 있듯..
2.5 객체 배열
- 많은 수의 객체를 다뤄야할 때 편함
- 객체 배열 안에는 인스턴스가 아닌 해당 객체의 주소가 저장 즉 참조변수들을 하나로 묶은 참조변수 배열
Tv tv1, tv2, tv3 ; ->>> Tv[] tvArr = new Tv[3];
길이가 3인 객체배열을 통해 해당 크기가 3인 각각 배열 안에는 defualt 값으로 null이 들어있음
아무것도 참조하지 않음
이렇게만 만드는 게 끝이 아니라 해당 배열 안에 참조할 주소를 넣어주어야함
tvArr[0] = new Tv(); // new를 통해 인스턴스 생성 후 그 주소가 배열 [0]에 저장
tvArr[1] = new Tv();
tvArr[2] = new Tv();
혹은 Tv[] tvArr = { new Tv(), new Tv(), new Tv() }
아니면 반복문도 가능 !
객체배열도 배열이기에 같은 자료형만 저장이 가능하다 즉 같은 타입의 객체만 저장가능
2.6 클래스의 또 다른 정의
- 클래스란 객체를 생성하기 위한 설계도 . 틀이며 클래스는 속성과 기능 즉 함수와 변수로 이루어짐
- String이라는 클래스로 문자열을 다룬다 이유 ? 필요한 함수들을 함께 묶기 위해서 그래서 .length를 사용가능 왜? 클래스니까!
3. 변수와 메서드
3.1 선언위치에 따른 변수의 종류
1) 인스턴스 변수
- 클래스 영역에 선언 / 인스턴스 생성시 같이 만들어짐
- 인스턴스는 독립적인 공간을 가지기에 해당 변수의 값은 서로 다른 값을 가질 수 있다
2) 클래스 변수
- 인스턴스변수에 static 붙이면 끝
- 클래스 변수는 공통된 공간을 공유 즉 한 클래스에서 파생된 모든 인스턴스들이 공통적인 값을 가짐
- 인스턴스변수와 달리 생성하지 않아도 언제든 사용가능 <클래스이름.클래스변수>
3) 지역변수
- 메서드 내에서만 사용되는 변수 메서드 종료시 소멸
- 우리가 보통 for문에서 선언한 변수가 for 문 나오면 사라지는 것과 동일
3.2 클래스 변수와 인스턴스 변수
- 트로트 카드의 경우 같은 사이즈의 높이와 크기를 가져야한다 - 클래스변수 static
- 각 트로트 카드의 값과 모양은 달라야한다 - 인스턴스변수
클래스변수는 인스턴스 생성 안해도 클래스이름.클래스변수 형식으로 사용가능
클래스 변수인 static은 공유하기 때문에 하나의 참조변수로 이를 접근해서 수정하면 나머지도 다 바뀌게 됨 -> 모두 같은 저장 공간을 참조하기에 따로 저장공간이 있다고 봐야함
인스턴스 변수는 인스턴수가 생성될 때마다 생성되기에 인스턴스마다 각각 다른 값을 가지지만 클래스 변수는 모든 인스턴스가 하나의 저장공간에 공유하므로 항상 공통된 값을 가진다
3.3 메서드
- 특정 작업을 수행하는 일련의 문자들을 하나로 묶은 것
- method는 하나의 값밖에 반환할 수 없기에 여러 결과값 반환하려면 배열이나 객체에 대한 참조변수를 사용하자
메서드 사용이유
1. 재사용성
2. 중복된 코드 제거 // 하나의 메소드는 하나의 기능만 수행하도록
3. 프로그램 구조화
3.4 메서드의 선언과 구현
매개변수 선언
- 메서드 작업시 필요한 값들 입력 제공
- 입력받을 필요없으면 ( )
반환타입
- 작업 수행 결과 타입을 적음
- 아무것도 없다면 void 작성
return문
- 반환값이 있는 method의 경우 모든 경우에 return문이 필요 // 없어도 error 안 뜬 이유는 컴파일러가 자동으로 추가해줌
- return문의 반환 타입은 해당 반환타입과 이리하거나 자동 형변환이 가능해야함
3.5 메서드의 호출
메서드의 실행흐름
- 같은 클래스 내 메서드끼리는 참조변수 없이 사용 가능
- static 메서드는 같은 클래스 내의 인스턴스 메서드 사용불가
3.7 jvm 메모리 구조
메서드 영역
- 클래스에 대한 정보 . 클래스변수의 영역
힙
- 인스턴스가 생성되는 공간
- 모든 인스턴스는 힙 영역에 생성되며 인스턴스변수가 이에 들어감
call stack
- 매서드 작업에 필요한 메모리 공간을 제공 ex _ main 메서드
- 메서드 작업 끝나면 해당 공간 반환
- 가장 먼저 호출된 메서드가 가장 밑에 두번째는 그 위
- 메서드가 호출되면 수행에 필요한 만큼 메모리를 스택에 할당
- 메서드가 수행을 마치고 나면 사용했던 메모리 반환하고 스택에서 제거
- 호출스택 제일 위에 있는 메서드가 현재 실행중인 메서드
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
3.8 기본형 매개변수와 참조형 매개변수
기본형 매개변수 - 변수의 값을 읽기만 가능
참조형 매개변수 - 변수의 값을 읽고 변경 가능
'Programing > Java' 카테고리의 다른 글
6-2 객체지향 (0) | 2021.03.28 |
---|---|
ch6 알고리즘 (0) | 2021.03.21 |
ch5 배열 백준 알고리즘 (0) | 2021.03.13 |
CH5 배열 (0) | 2021.03.12 |
ch 4 조건문과 반복문 _ 알고리즘 (0) | 2021.03.07 |