
객체
- 의사나 행위가 미치는 대상 ( 사전적 의미 )
- 구체적, 추상적 데이터의 단위 ( 학생, 회원, 생산, 주문, 배송 )
학생도 객체이고, 회원도 객체이고, 생산, 주문, 배송도 객체라고 할 수 있습니다.
객체지향 프로그래밍과 절차 지향 프로그래밍의 비교
- 절차지향 프로그래밍이란 시간이나 사건의 흐름에 따른 프로그래밍입니다.
일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다-> 요금을 지불한다 -> 학교에 도착
- 객체 지향 프로그래밍

객체 지향 프로그래밍은 객체를 정의하고, 각 객제에서 제공하는 기능들을 구현하고, 각 객체가 제공하는 기능들간의 소통을 통하여 객체 간의 협력을 구현합니다.
생활속의 객체를 클래스로 구현하며 개념을 잘 이해해보겠습니다.
클래스
클래스는 객체의 청사진(blueprint) 입니다.
클래스는 일반적인 것을 추상한 것입니다.
클래스는 대문자로 시작하는 것이 좋고 역시 camel notation방식으로 운영합니다.
java 파일 하나에 클래스는 여러 개가 있을 수 있지만, public 클래스는 하나이고, public 클래스와 .java 파일의 이름은 동일합니다.
학생, 주문, 회원 클래스를 만들 수 있습니다.
public class Student {
int studentNumber;
String studentName;
int majorCode;
String majorName;
int grade;
}
public class Order {
int orderId;
String buyerId;
String sellerId;
int productId;
String orderDate;
}
public class UserInfo {
String userId;
String userPassWord;
String userName;
String userAddress;
int phoneNumber;
}
클래스 안에 선언된 변수들을 멤버변수라고 부릅니다.
함수와 메서드
함수

함수란 하나의 기능을 수행하는 일련의 코드 입니다.
구현된 함수는 호출하여 사용하고, 호출된 함수는 기능이 끝나면 제어가 반환 됩니다.
함수로 구현된 하나의 기능은 여러곳에서 동일한 방식으로 사용할 수 있습니다.
함수 정의하기
함수는 이름, 매개변수, 반환 값, 함수 몸체(body)로 구성됩니다.
int add(int num1, int num2) {
int result;
result = num1 + num2;
return result;
}
반환값이 없는 경우는 void 를 넣어줍니다.
함수 호출과 스택 메모리
함수가 호출될 때 지역변수들은 스택 메모리에 저장됩니다.
함수의 수행이 끝나면 자동으로 반환 됩니다.

메서드
객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수입니다.
멤버함수라고도 합니다.
메모리와 함수
함수는 어디 속해 있는 것입니다.
메서드는 클래스 안에 속해있다. 클래스의 멤버변수들을 활용해서 구현되는게 메서드입니다.
클래스의 정의와 사용
객체의 속성은 멤버변수로, 객체의 기능은 메서드로 구현합니다.
학생 클래스 생성
package ch04;
public class Student {
public int studentID;
public String studentName;
public String address;
public void showStudentInfo() {
System.out.println( studentID + "학번의 이름은" + studentName + "이고, 주소는" + address + "입니다.");
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
}
package ch04;
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentID = 12345;
studentLee.setStudentName("Lee");
studentLee.address = "서울 강남구";
studentLee.showStudentInfo();
Student studentKim = new Student();
studentKim.studentID=54321;
studentKim.studentName="Kim";
studentKim.address="경기도 성남시";
studentKim.showStudentInfo();
}
}
Student 클래스에서 studentLee라는 인스턴스를 하나 생성했습니다. 그리고 각각 이름과 주소를 대입합니다.
객체를 인스턴스라고 많이 칭합니다.
인스턴스 생성과 힙메모리
인스턴스 (instance)
- 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
- 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨
- 가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 됨
- new 키워드를 사용하여 인스턴스 생성
힙 메모리
- 생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
- C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함 ( free() 난 delete 이용)
- 자바에서 Garbage Collector 가 주기 적으로 사용하지 않는 메모리를 수거
- 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨

studentLee는 지역변수(참조변수)로 stack에 저장되고 이는 heap에 있는 인스턴스를 가리킵니다.
참조 변수, 참조 값
Student studentLee = new Student();
studentLee.studentName = "홍길동";
System.out.println(studentLee);
studentLee - 참조변수
studentLee를 프린트 했을 때 나오는 값은 참조 값
용어 정리
객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
클래스 : 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태
인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태
멤버 변수 : 클래스의 속성, 특성
메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값
생성자
- 생성자 기본 문법 <class_name>([<argument_list]) { [<statements] }
- 객체를 생성할 때 new 키워드와 함께 사용 - new Student();
- 생성자는 일반 함수처럼 기능을 호출하는 것이 아니고 객체를 생성하기 위해 new 와 함께 호출 됨
- 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출 함
- 생성자는 반환 값이 없고, 클래스의 이름과 동일
- 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private 으로 선언되는 경우도 있음
생성자는 힙메모리에 인스턴스가 생성됩니다.
기본 생성자 (default constructor)
클래스에는 반드시 적어도 하나 이상의 생성자가 존재합니다.
클래스에 생성자를 구현하지 않더라도 new 키워드와 함께 생성자를 호출 할 수 있는데 그 이유는, 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드는 넣어주기 때문입니다.
그것이 기본 생성자입니다.
기본생성자는 매개변수와 구현부가 없습니다.
public Student(){}
컴파일러가 제공해주는 기본 생성자 외에도 필요에 의해 생성자를 직접 구현 할 수 있습니다.
Student.java
package ch06;
public class Student {
public int studentNumber;
public String studentName;
public int grade;
public Student() {}
public Student(int studentNumber, String studentName, int grade) {
this.studentNumber= studentNumber;
this.studentName=studentName;
this.grade=grade;
}
public String showStudentInfo() {
return studentName + "학생의 학번은" + studentNumber + "이고 grade는" + grade + "입니다.";
}
}
StudentTest.java
package ch06;
public class StudentTest {
public static void main(String[] args) {
Student Lee = new Student();
System.out.println(Lee.showStudentInfo());
Student Kim = new Student(123456, "Kim", 3);
System.out.println(Kim.showStudentInfo());
}
}
기본 생성자가 아닌 생성자를 만들고 나면 기본생성자는 존재하지 않게 됩니다.
그래서 기본생성자가 필요하다고 느낀다면 직접 기본생성자를 만들어 줘야 합니다.
기본생성자는 사용해선 안될 경우도 있습니다. 잘 생각하고 생성자를 만들어야 합니다.
생성자 오버로딩
클래스에 생성자를 따로 구현하면 기본생성자는 제공되지 않습니다.
생성자를 호출하는 코드(client)에서 여러 생성자 둥 필요에 따라 호출 할 수 있습니다.
'Java' 카테고리의 다른 글
| [Java] 접근 제어 지시자 / 정보 은닉 (0) | 2022.09.21 |
|---|---|
| [Java] 참조 자료형 변수 (0) | 2022.09.21 |
| [Java] 제어문 (0) | 2022.09.20 |
| [Java] 자바의 연산자들 (0) | 2022.09.19 |
| [Java] 자바프로그래밍이란 (0) | 2022.09.19 |