객체지향프로그래밍과 클래스
- 객체지향프로그래밍
- 객체를 정의하고 객체 간 협력을 프로그래밍하는 것
- 먼저 객체를 만들고 객체 사이에 일어나는 일을 구현하는 것
- 각 객체가 어떤 기능을 제공하고 객체 간 협력을 어떻게 구현할 것인지를 구현한다
- ( 예시 ) 학생이 아침에 일어나 학교에 가기까지의 과정을 절차지향프로그래밍입장으로 보면 << 아침에 일어난다 → 씻는다 → 밥을먹는다 → 버스를탄다 → 요금을 지불한다 → 학교에 도착 >>으로 표현할 수 있지만, 객체지향프로그래밍입장으로 보면 << 대상이 되는 객체(학생,밥,버스,학교)를 정의 → ‘밥을 먹는다’는 행동은 ‘학생’ 객체와 ‘밥’ 객체가 먹는다는 행동이 발생하는 것, ‘버스를탄다’는 행동은 ‘학생’ 객체와 ‘버스’ 객체에 타는 행동이 발생하는 것 >> 이다
- 자료형
- 기본자료형(primitive data type) : int, long, double, float 등
- 참조자료형: String, Date와 같이 jdk에서 제공하는 자료형, 개발자가 직접 만든 클래스(Student, Person)가 다른 클래스에서 멤버 변수의 자료형이 될 수도 있다
- 클래스
- 객체의 속성과 기능을 코드로 구현한 것
- 클래스 이름은 대문자로 시작한다
- ( 예시 ) 학생 객체를 클래스로 표현할 때 이름, 학번, 학년, 사는 곳 등 객체가 가지는 일반적인 속성을 클래스의 속성이라고 하며, 클래스 내부에 변수로 선언한다.
- 클래스 속성(property) = 클래스 특성(attribute) = 클래스 내부 변수 = 멤버 변수
- 메서드
- 클래스 내부에서 멤버변수를 사용하여 클래스의 기능을 구현한다
- ( 예시 ) 학생에게 이름을 부여한다, 학생이 사는 곳을 출력한다 등 클래스 내부에서 멤버변수를 사용하여 기능을 구현할 수 있다.
- 패키지
- 클래스 파일의 묶음
- 패키지는 계층 구조를 가질 수 있다 패키지 안에 하위 패키지를 만들면서 계층 구조를 구성하여 소스코드를 관리한다
- ( 예시 ) main.strudent.grade 와 같이 하위 패키지를 표현할 수 있다
메서드
반환형 함수이름 (매개변수자료형 매개변수1, 매개변수자료형 매개변수2, ...) {
...
return 반환하고싶은결과;
}
(예시) 두 개의 숫자를 입력받고 더한 값을 반환하는 함수
int add(int num1, int num2) {
int result;
result = num1 + num2;
return result;
}
- 매개 변수
- 함수의 입력으로 받는 변수
- 함수 내부에서 사용할 괄호 안의 변수
- 함수를 호출할 때 괄호 안의 자료형에 맞게 함수에 전달된다
- 매개변수가 없는 함수도 존재한다
- 반환값
- 메서드를 호출했을 때 반환되는 값
- return을 사용하여 메서드의 결과를 반환한다
- 반환값의 자료형을 반환형이라고 하며 함수 이름 앞에 작성한다
- 반환값이 없는 함수도 존재한다(반환값이 비어있다는 의미로 반환형에 void를 적는다)
- return가 있지만 반환형이 void인 경우도 존재한다(return;에서 함수수행을 종료한다)
- 메서드 스택과 스택 메모리
- 함수를 호출하면 그 함수만을 위한 메모리공간이 할당된다 = 스택(stack)
- 프로그램을 시작할 때 main()함수부터 호출되며 이 때 main()함수에 포함된 변수를 저장할 메모리 공간이 생성된다.
- main()함수 안에있는 다른 함수를 호출하면 그 함수에 포함된 변수를 저장할 메모리 공간이 스택에 새롭게 생성된다
- 함수 수행이 끝나면 사용한 메모리 공간은 자동으로 사라진다
- 스택으로 생성된 메모리 공간은 main()함수에서 A() → B() →C() 순서대로 함수가 호출되었다면 C() → B() → A() 순서로 반환된다
- main()함수와 A()함수가 사용하는 메모리 공간은 서로 다른 공간을 사용하므로 변수의 이름이 같든 다르든 상관없다 (지역변수)
- ( 예시 ) 먼저 main()호출 → main()함수의 변수를 저장할 메모리공간 생성 → main()함수에서 A()함수 호출 →A()함수를 저장할 메모리 공간이 스택에 새롭게 생성 → A()함수 수행이 끝나면 A()함수가 사용한 메모리 공간은 자동으로 사라짐
- 메서드의 장점
- 기능을 나누어 코드를 효율적으로 구현할 수 있다
- 기능별로 함수를 구현해 놓으면 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를 호출하면 되므로 편리하다
- 오류를 수정하는 디버깅 작업에도 편리하다
- 클래스 기능을 구현하는 메서드
- getter setter ( 인텔리제이 단축키 : cmd+N)
- getter메서드 : 다른 클래스에서 변수를 가져오는 기능을 제공
- setter메서드 : 다른 클래스에서 변수의 값을 지정하는 기능을 제공
클래스와 인스턴스
-
main()함수
-
자바가상머신(java virtual machine,jvm)이 프로그램을 시작하기 위해 호출하는 함수
-
클래스 내부에 만들지만 클래스의 메서드는 아니다
-
main함수에서 클래스를 사용하는 방법 : 우리가 만든 클래스 내부에 main()함수를 만드는 것 / 외부에 테스트용 클래스를 만들어 사용하는 것
-
maint()함수에서 다음과 같이 입력하여 새로운 클래스를 생성할 수 있다
클래스형 변수이름 = new 생성자;
(예시)
Student studentAhn = new Student();
-
Student 클래스 자료형으로 studentAhn 변수를 선언하고 new Student();로 Student클래스를 생성하여 studentAhn에 대입한다는 뜻이다
-
이 때 studentAhn을 참조변수라고 하고 이 변수가 생성된 인스턴스를 가리킨다
-
인스턴스, 참조변수
- 객체 : 의사나 행위가 미치는 대상
- 클래스 : 객체를 코드로 구현한 것
- 인스턴스 : 클래스가 메모리 공간에 생성된 상태
- 생성된 클래스의 인스턴스를 객체라고도 한다
- 클래스라는 틀에서 인스턴스를 여러 개 만드는 것
- 그 인스턴스를 가르키고 있는 것을 참조변수라고 한다
public class Student {
String studentName; //클래스 내부의 속성,특성,멤버변수
public String getStudentName() { //클래스 내부의 메서드
return studentName;
}
public void setStudentName(String name) { //String name은 메서드의 매개변수
studentName = name;
}
public static void main(String[] args) {
Student student1 = new Student(); //student1은 첫번째로 생성된 인스턴스를 가르키는 참조변수
student1.studentName = "안연수"; //첫번째로 생성된 인스턴스 내부의 멤버변수 사용
System.out.println(student1.getStudentName());
Student student2 = new Student(); //student2는 두번째로 생성된 인스턴스를 가르키는 참조변수
student2.studentName = "안승연"; //두번째로 생성된 인스턴스 내부의 멤버변수 사용
System.out.println(student2.getStudentName());
}
}
-
인스턴스와 힙 메모리
- new 클래스명()을 선언하면 해당 클래스의 인스턴스가 하나 생성되는데, 이때 멤버변수를 가지고 있다
- 이 떄 변수를 저장할 공간이 있어야 하는데 이를 힙 메모리라고 한다
- 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것
- 즉 위의 예시에서 student1, student2와 같은 참조변수는 각각의 인스턴스가 저장된 메모리를 가리키는 것
- student1, student2 변수는 참조변수이자 지역변수이므로 스택메모리에 생성된다. 인스턴스는 힙 메모리에 생성된다.
<aside>
✨ 쉽게 말하면, 스택메모리는 Primitive type가 값과함께 저장되는 곳이며 참조변수가 저장되는 곳, 메서드가 시작할때 할당되고 종료하면 사라진다. 힙메모리는 Primitive type을 제외한 Object type이 저장되는 곳이며 stack을 제외한 다른 데이터가 저장되는 부분이다
</aside>