배열(Array)과 클래스(Class)
- 배열
변수는 한 개의 데이터만 저장하지만, 배열은 같은 타입의 데이터를 연속된 공간에 저장하므로 속도면에서 좋다.
각 데이터는 인덱스를 부여한다.
배열은 생성 시 0으로 초기화된다.
빨간(스택영역), 파란색(힙영역)
b는 array의 주소값을 가지게 된다.
이는 메모리 공간을 절약 하게 된다. ( 만약, 주소값을 참조하지 않는다면 메모리 공간을 차지해서 array 20byte + b 20btye = 40byte 가 필요하게 되지만 b가 주소값을 가지면 array 20 byte + b 1byte = 21btye)
주소값을 가지고 heap영역에서 해당 주소값을 찾아가서 값을 가져온다.
배열 = null; 쓰지 않아도 상관없다.
C나 C++은 가비지 컬렉션이 없기때문에, 개발자가 메모리 해제 해줘야한다. 이때, 만약 참조하던 배열이 있는데 실수로 메모리해제 해버린 경우 문제가 발생한다.
위에서는 heap영역과 stack영역에서의 메모리 영역이였다.
아래의 경우는 블럭에서의 변수의 유효성에 대해 설명한다.
메모리 공간에서 데이터가 사라지기 때문에 사용할 수 없다.
DS(Data Segmentation) 에서 heap의 데이터는 stack이 참조하고 있으면 소멸되지 않는다.
stack은 블럭단위로 데이터가 생성, 소멸된다.
- 배열 선언 방법
클래스(Class)
객체지향언어
객체지향이론의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.' 라는 것이다. 객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 점차 구체적으로 발전되었다. 객체지향언어의 가장 큰 장점은 코드의 재사용성이 높고 유지보수가 용이하다는 것이다.
객체
: 객체란? '실제로 존재하는 것. 사물 또는 개념' 이다. 객체지향이론에서 객체는 유무형 다 가능하다. 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
- 객체의 구성요소 (속성과 기능)
: 객체는 속성과 기능이라는 두 종류의 구성요소로 이루어져 있다.
속성(Property) - 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(Function) - 메소드(method), 함수(function), 행위(behavior)
객체지향 프로그래밍에서는 속성과 기능을 각각 변수와 메소드로 표현한다.
객체와 인스턴스
: 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.
예를 들면, Tv클래스로부터 만들어진 객체를 Tv클래스의 인스턴스라고 한다. 결국 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.
'책상은 인스턴스다.' (X) 라고 하기 보다는 '책상은 객체다'(O)
'책상은 책상클래스의 객체이다.'(X) 라고 하기 보다는 '책상은 책상 클래스의 인스턴스다.'(O)
클래스
: 클래스란? '객체를 정의해놓은 것' 이다. 클래스는 객체를 생성하는데 사용된다.
- 구현클래스 : 다른 클래스에서 쓸 수 있게 사용자가 만든 클래스
- 실행클래스 : main 함수 갖고 있는 클래스
- 추상클래스 : 상속 / 자신의 객체발생이 안됨
- Interface : 상속 / 자신의 객체발생이 안됨
예제 1) x, y 정수를 가지고 있는 Su클래스를 만들어보자.
디버깅을 해보자
해당클래스로 넘어가려면 F5, 다음을 실행하려면 F6
객체 생성시 모두 0으로 초기화된다.
[참고] 전역변수 선언시 모두 0으로 초기화, 지역변수는 초기화되지 않는다.
예제 2) 이름, 나이, 키 정보를 가지고 있는 Person 클래스를 만들어보자.
만약 데이터가 100만개라면? 위의 방식으로 100만개 다 입력하는 것은 비효율적이다. 가독성 떨어지고 코드 중복
출력기능을 하는 출력함수로 disp()를 작성해보자.
객체를 생성해서 데이터를 전달하는 input() 입력함수도 작성해보자.
클래스가 전달해주는 변수값을 가지고 있지 않아서 데이터를 넣어줬음에도 값이 출력되지 않았다.
input() 함수의 인자값을 Person 속성에 전달해준다.
함수를 이용해서 코드를 간결하게 작성할 수 있다.
[정리]
- 클래스에는 함수, 변수가 들어가있다. (멤버 함수, 멤버 변수)
- 클래스는 하나의 모듈. 변수는 데이터를 입력받는 멤버변수, 클래스안에서 사용하는 로직을 위한 변수, 그리고 함수가 있다.
- 변수 안에는 데이터가 들어가야한다. 데이터에 접근하는 3가지 방법이 있다.
- 실무에서는 대부분 함수를 통해 접근한다.
데이터에 접근하는 3가지 방법
- . 연산자를 통한 접근
- 함수를 통합 접근
- 생성자를 통한 접근
자바의 3가지 식별자
- 변수
- 객체
- 배열
예제 3) 이름, 연봉, 세금, 실수령액 정보를 가지고 있는 Pay 클래스를 만들어보자.
예제 4) 이름, 국어성적, 영어성적, 수학성적, 총합점수, 총점평균, 학점 정보를 가지고 있는 sungjuk 클래스를 만들어보자.
선언위치에 따른 변수의 종류
변수의 종류 | 선언위치 | 생성시기 |
클래스변수 | 클래스영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수 | 인스턴스가 생성되었을 때 | |
지역변수 | 클래스 영역 이외의 영역(메소드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
1. 인스턴스변수
: 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다. 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다. 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스 변수로 선언해야한다.
2. 클래스변수
: 클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static을 붙이기만 하면 된다.
인스턴스마다 독립적인 저장공간을 갖는 인스턴스변수와는 달리, 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스 변수로 선언해야한다.
3. 지역변수
: 메소드 내에 선언되어 메소드 내에서만 사용 가능하며, 메소드가 종료되면 소멸되어 사용할 수 없게 된다. for문 또는 while문의 블럭 내에 선언된 지역변수는, 지역변수가 선언된 블럭{} 내에서만 사용 가능하며, 블럭{}을 벗어나면 소멸되어 사용할 수 없게 된다 .
class Card{
//인스턴스 변수
String kind;
int number;
//클래스변수
static int width = 100;
static int height = 200;
}