1. 객체 지향 프로그래밍과 클래스
1-1. 객체와 객체 지향 프로그래밍
- 객체지향 프로그래밍(Object-Oriented Programming; OPP)
- 객체를 기반으로 하는 프로그래밍
- 객체 사이에 일어나는 일을 구현
- 객체를 먼저 정의하고 객체의 제공 기능과 협력 구현을 고민해야 함
1-2. 클래스란?
- 클래스: 객체의 속성과 기능을 코드로 구현한 것
- 클래스의 이름, 멤버 변수 필요
- 클래스 이름 코딩 컨벤션(coding convension): 대부분 대문자로 시작
2. 클래스 살펴보기
2-1. 클래스 속성을 구현하는 멤버 변수
- 변수의 자료형
- 기본 자료형: int, long, float, double 등
- 참조 자료형(객체 자료형): String, Date, 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형 등
2-2. 클래스 기능을 구현하는 메서드
- 멤버 함수(member function) or 메서드(method): 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것
2-3. 패키지란?
- 클래스의 묶음
- 패키지 선언
- 자바 소스 코드에서 클래스의 패키지 선언은 맨 위에 함
- 클래스의 전체 이름(class full name)에는 패키지 이름이 포함되므로 같은 이름의 클래스라도 다른 패키지에 속해 있으면 서로 연관이 없음
3. 메서드
3-1. 함수란?
- 하나의 기능을 수행하는 일련의 코드
- 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용 가능
3-2. 함수의 입력과 반환
- 매개변수: 함수의 입력으로 받는 변수
- 반환 값: 결과 값
3-3. 함수 정의하기
- 함수 반환형
- int, float, double 등 반환 자료형 입력
- 반환 값이 없는 함수의 경우 void로 작성
- 매개변수: 매개변수가 필요없는 경우도 존재
- return 예약어
- 값 반환 시 사용
- 함수 수행을 끝내고 프로그램 흐름 중에서 호출한 곳으로 다시 되돌아갈 때도 사용 가능
- 함수 예제
public class FunctionEx {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
int sum = add(num1, num2)
System.out.println(num1 + "+" + num2 + "=" + sum +);
}
public static int add(int n1, int n2) {
int result = n1 + n2;
retrun = result;
}
}
3-4. 함수 호출과 스택 메모리
- 스택(stack): 함수만을 위한 메모리 공간
- A(), B(), C() 순서대로 함수의 호출이 이루어졌다고 한다면 C(), B(), A() 순서로 반환되며 스택 메모리 소멸 순서도 이와 같음
3-5. 함수의 장점
- 기능을 나누어 코드를 효율적으로 구현할 수 있음
- 같은 기능을 매번 코드로 만들지 않고 함수를 호출하여 사용하면 됨
- 하나의 함수에 하나의 기능을 구현하는 것이 중요
3-6. 클래스 기능을 구현하는 메서드
- 메서드(method): 클래스 내부에서 사용하는 멤버 함수
- 낙타 표기법(카멜 표기법, camel notation)
- 변수와 메소드 이름의 시작을 소문사로, 이후에 작성하는 새로운 단어의 시작은 대문자로 작성하여 가독성을 높임
- ex) setStudnetName, getStudnetName
4. 클래스와 인스턴스
4-1. 클래스 사용과 main() 함수
- main() 함수
- 자바 가상 머신(Java Virtual Machine; JVM)이 프로그램을 시작하기 위해 호출하는 함수
- 클래스 내부에 만들지만 클래스의 메서드는 아님
- main() 함수에서 클래스를 사용하는 방법
- 만든 클래스 내부에 main() 함수를 만드는 것
- 외부에 테스트용 클래스를 만들어 사용하는 것
4-2. new 예약어로 클래스 생성하기
- 클래스형 변수이름 = new 생성자;
- 클래스 생성: 클래스를 사용할 수 있도록 메모리 공간(힙 메모리)에 올림
- 인스턴스: 실제로 사용할 수 있도록 생성된 클래스
- 참조 변수: 인스턴스를 가리키는 클래스형 변수
4-3. 인스턴스와 참조별수
- 객체: 의사나 행위가 미치는 대상
- 클래스: 객체를 코드로 구현한 것
- 인스턴스
- 클래스가 메모리 공간에 생성된 상태
- 인스턴스 여러 개 생성 가능
- 참조 변수 사용
- 도트(.) 연산자 사용
- ex) studentKim.setStudentName = "Kim";
4-4 인스턴스와 힙 베모리
- 힙 메모리(heap memory): 변수를 저장하는 공간
- 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성됨
- 클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지함
- 멤버 변수를 저장하는 공간이 매번 따로 생긴다는 의미
- 인스턴스 대입 = 인스턴스가 생성된 힙 메모리의 주소를 대입
- 인스턴스는 힙 메모리, 지역 변수는 스택 메모리에 생성됨
- 참조 변수와 참조 값
- 인스턴스 메모리 주소: 힙 메모리에 생성, 참조 변수에 저장
- 출력 시 '클래스 이름@주소 값(해시코드(hash code))'
[용어 총 정리]
용어 | 설명 |
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |
[나 혼자 코딩] 1. 클래스를 만들고 결과 값을 출력하여라.
나이: 40살, 이름: James, 남자, 기혼, 자식: 3 [출력 결과] 나이, 이름, 결혼 여부, 자녀 수 |
public class C5_E1_Person {
public int age;
public String name;
public boolean marriage;
public int children;
public C5_E1_Person(int age, String name, boolean marriage, int children) {
this.age = age;
this.name = name;
this.marriage = marriage;
this.children = children;
}
public void getPersonInfo() {
System.out.println("age: " + age);
System.out.println("name: " + name);
System.out.println("marriage: " + marriage);
System.out.println("children: " + children);
}
public static void main(String[] args) {
C5_E1_Person James = new C5_E1_Person(40, "James", true, 3);
James.getPersonInfo();
}
}
[나 혼자 코딩] 2. 쇼핑몰 주문 내용이 다음과 같을 때 클래스를 만들고 주문 내용을 인스턴스로 생성한 후에 출력하라.
주문 번호: 201803120001 주문 아이디: abc123 주문 날짜: 2018년 3월 12일 주문자 이름: 홍길동 주문 상품 번호: P0345-12 배송 주소: 서울시 영등포구 여의도동 20번지 |
public class C5_E2_ShoppingMall {
public String orderNumber;
public String id;
public String orderDate;
public String name;
public String orderGoodNumber;
public String address;
public C5_E2_ShoppingMall(String orderNumber, String id, String orderDate, String name,
String orderGoodNumber, String address) {
this.orderNumber = orderNumber;
this.id = id;
this.orderDate = orderDate;
this.name = name;
this.orderGoodNumber = orderGoodNumber;
this.address = address;
}
public void getOrderInfo() {
System.out.println("주문 번호: " + orderNumber);
System.out.println("주문자 아이디: " + id);
System.out.println("주문 날짜: " + orderDate);
System.out.println("주문자 이름: " + name);
System.out.println("주문 상품 번호: " + orderGoodNumber);
System.out.println("배송 주소: " + address);
}
public static void main(String[] args) {
C5_E2_ShoppingMall order1 = new C5_E2_ShoppingMall("201803120001", "abc12",
"2018년 3월 12일", "홍길동", "PD0345-12", "서울시 영등포구 여의도동 20번지");
order1.getOrderInfo();
}
}
5. 생성자
5-1. 생성자란?
- 생성자(constructor)
- 생성자는 클래스를 생성할 때만 호출함
- 생성자 이름은 클래스 이름과 같음
- 반환 값이 없음
- 디폴트 생성자(default constructor)
- 생성자가 없는 클래스는 컴파일 시 자바 컴파일러에서 자동 생성자를 만들어줌
5-2. 생성자 오버로드(constructor overload)
- 필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있음
6. 참조 자료형
6-1. 참조 자료형
- 클래스 자료형으로 선언하는 자료형
- 기본 자료형을 사용하듯이 클래스 자료형 변수를 선언해서 사용하는 것
7. 정보 은닉
7-1, 접근 제어자 살펴보기
- 접근 제어자(access modifier)
- 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정하는 예약어
- public : 외부 클래스에서 접근 가능
- private: 외부 클래스에서 사용 불가
7-2. get(), set() 메서드
- public 메서드가 제공되지 않는 경우에 접근할 수 있게 만들어주는 메서드
7-3. 정보 은닉(information hiding)
- 객체 지향 프로그래밍 특징 중에 하나
- 자바에서는 접근 제어를 사용하여 정보 은닉을 구현
- private으로 선언하여 외부에서의 접근을 막음
[접근 제어자의 종류]
접근 제어자 | 설명 |
public | 외부 클래스 어디에서나 접근 가능 |
protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근 가능 |
아무것도 없는 경우 | default이며 같은 패키지 내부에서만 접근 가능 |
private | 같은 클래스 내부에서만 접근 가능 |
'JAVA > Do it! 자바 프로그래밍 입문' 카테고리의 다른 글
[Do it 자바 프로그래밍 입문] 06 클래스와 객체 2 (0) | 2023.03.25 |
---|---|
[Do it 자바 프로그래밍 입문] 05 클래스와 객체 1 연습문제 (0) | 2023.03.24 |
[Do it 자바 프로그래밍 입문] 04 제어 흐름 이해하기 연습문제 (0) | 2023.03.23 |
[Do it 자바 프로그래밍 입문] 04 제어 흐름 이해하기 (0) | 2023.03.23 |
[Do it 자바 프로그래밍 입문] 03 자바의 여러 가지 연산자 연습문제 (0) | 2023.03.23 |