1. 객체지향 프로그래밍
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위(=객체)들의 모임으로 파악하는 것
→ 각각의 객체는 메시지를 주고받고 데이터를 처리한다.
- 책상도면 예시
클래스 | = 설계도면 | 클래스를 사용하려면 오브젝트를 만들어야함 |
인스턴스 & 오브젝트(객체) | = 책상 | 설계도면으로 만들어짐 |
참조형변수 | = 인스턴스를 사용하기 위한 이름 | ↔ 쓰레기(Garbage) |
객체지향 프로그래밍이란 클래스를 이용하지 않고, 실제 현실 객체(=책상)이용해 어떻게 객체가 동작할까 고민하는 것
[예시]
Book b = new Book();
→ heap이라는 메모리에 인스턴스(=book) 생성
Book | 레퍼런스 type | |
b | 참조 변수 | - Book을 가르키는 레퍼런스 변수 - 값을 가지는 것이 아닌 객체를 가르키는 것 +int / double / short / long =참조형 타입X /특정 크기만큼 메모리 값 가짐 |
new | 인스턴스 생성 | Book 생성 |
Book() | 생성된 인스턴스 | =클래스 이름 = 생성자 |
new Book();
→ 참조변수 X → Garbage
2. 클래스
= 필드(Field)와 메소드(Method)를 가진다
- 필드: 클래스의 속성
- 메소드: 클래스의 기능
접근제한자(public, protected, private) class 클래스이름 {
필드들;
생성자들;
메소드들;
}
1) 클래스 선언 방법
- 첫문자가 문자나 ‘_’, ‘$’의 특수문자로 시작되어야 한다. 숫자X |
- 첫문자가 아니라면, 문자나 ‘_’, ‘$’의 특수문자, 숫자로 구성될 수 있다. JDK8에서는 ‘_’한글자로 이루어진 변수는 예약어로 정의되어 있기 때문에 사용할 수 없다. |
- 자바의 예약어는 식별자로 사용X |
- 자바의 식별자는 대소문자 구분O |
- 식별자 길이는 제한X, 공백포함X |
관례 | |
- 클래스 명은 대문자로 시작 | |
- 카멜표기법 = 단어와 단어가 만날 경우 2번째 단어의 시작은 대문자 Ex) ‘Hello’ & ’World’ 사용해서 클래스 이름 만든다면 ’HelloWorld’ |
2) 자판기 예시
프로그래밍 시 사용자가 원하는 요구사항 정의 & 설계
① 요구사항 정의 = 어떤 객체로 구성되어 있을까? 객체들은 어떤 기능을 할까?
- 명사 = 인스턴스 객체 (자판기, 물건, 동전)
- 동사 = 메소드 (동전넣기, 잔액보여주기)
② 설계 = 내가 만들어야 할 객체들의 이름, 클래스이름 정의 → 객체간의 관계 표현(=선 긋기)
자판기 → 1 → 동전통 (자판기는 1개의 동전통 가짐)
상품배출기 → 상품케이스 (상품배출기가 상품케이스 이용)
[코드]
public class VendingMachine {
// field
// 생성자
// method
}
Field = 자판기가 가지는 것 (동전통, 상품케이스 등)
Method = 자판기가 할 수 있는 기능
→ vendingMachine.class 라는 파일 생성 / but 사용X (실행되려면 main 메소드 있어야함)
public class VendingMachineMain {
public static void main(String[] args){
VendingMachine vm1 = new VendingMachine();
}
}
메모리상에 인스턴스 1개 생성
메인메소드에 VendingMachine 클래스가 사용됨
- 모든 프로그램은 메모리에 올라가야지만 실행가능
new 사용해야 클래스가 메모리에 올라가서 인스턴스 될 수 O → 인스턴스에 올라가야만 오브젝트로 사용 가능
But static메소드는 바로 가능!
- VendingMachineMain은 VendingMachine 클래스 사용
= VendingMachineMain은 VendingMachine에 의존한다 (String 클래스에도 의존함)
3. 인스턴스
1) 인스턴스 생성
① new 연산자와 생성자를 이용
② 클래스 로더 이용
③ 메모리에 있는 인스턴스를 복제
2) 메모리
- 메모리에 올라가야만 실행O
- new연산자 사용하면 메모리에 인스턴스생성 (너무 많아지면 메모리부족)
4. 메소드
만들고 싶은 프로그램 있을 때: 프로그램 구성하는 객체들이 메모리에 몇 개 올라가고, 메모리에 올라간 객체들끼리 어떤 관계인지 생각 → 클래스 작성
- 객체 지향의 핵심은 ‘메시징’이다.
훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모든 내부의 속성과 행동이 어떤가 보다 모듈이 어떻게 커뮤니케이션 하느냐에 달려있다.
1) 메소드 선언
[접근 제한자] [static] 리턴type 메소드이름([매개변수, ...]){
...
//메소드 블록
...
}
[] 안은 생략 가능!
[코드]
Public static void main(String[] args) 메소드 블록
- 매개변수: 메소드의 정의 부분에 나열되어 있는 변수들
- 전달인자: 메소드를 호출할 때 전달되는 실제 값
+ 메소드 이름 = 소문자로 시작 (↔클래스 이름 = 대문자로 시작)
[예제]
public String pushProductButton(int menuID)
자판기에 메소드를 추가한다.
- menuID가 1을 선택하면 "콜라", 2가 선택되면 "사이다", 3이 선택되면 "환타"를 반환한다.
public String pushProductButton(int menuID) {
System.out.println(menuId + "를 전달받았습니다.");
return "콜라";
}
public class VendingMachineMain {
public static void main (String[] args){
VendingMachine vm1 = new VendingMachine();
VendingMachine vm2 = new VendingMachine();
String product = vm1.pushProductButton(100);
System.out.println(product);
}
}
→ 출력
2) 메소드 종류 (매개변수 / 반환값에 따라)
3) static 메소드
static한 메소드는 인스턴스를 생성하지 않아도 호출할 수 있다.
VendingMachine.printVersion();
[예제1]
public class VendingMachine {
//field
//생성자
//method
public String pushProductButton(int menuId){
System.out.println(menuId+"를 전달받았습니다.");
return "콜라";
}
public static void printVersion(){
System.out.println("1.0");
}
}
public class VendingMachineMain {
public static void main(String[] args){
VendingMachine.printVersion();
//String product = VendingMachine.pushProductButton(100); // 오류
// pushproductbutton이 static이 아니기때문에 인스턴스를 생성하지 않은 메소드는 호출 불가
VendingMachine vm1= new VendingMachine();
String product = vm1.pushProductButton(100);
vm1.printVersion(); // static한 메소드는 레퍼런스변수명.satic메소드() 도 가능
System.out.println(product);
}
}
Q. java vendingMachineMain은 어디서 찾아서 실행?
A.
→ 메소드 안에 선언된 지역변수는 메소드가 실행될 때 생성되었다가 메소드가 종료될 때 사라진다.
동시에 메소드가 호출되어도 문제없다.
[예제2] Math Class 만들기
public class MathTest {
public static void main(String[] args) {
int value = Math.abs(-5);
System.out.println(value);
}
}
→ 출력: 5
public class MyMath {
public static int abs(int x){
if (x<0)
return x * -1;
else
return x;
}
}
public class MyMathTest {
public static void main(String[] args) {
int value = MyMath.abs(-5);
System.out.println(value);
MyMath m = new MyMath();
}
}
+ static없으면 오류
'[즐거운 자바 강좌] 정리' 카테고리의 다른 글
[즐거운 자바 강좌] 섹션 5 - 배열(Array) (1) | 2024.03.31 |
---|---|
[즐거운 자바 강좌] 섹션4 - 팩토리 메소드(Factory Method) 패턴 (0) | 2024.03.31 |
[즐거운 자바 강좌] 섹션4 - 인터페이스(interface) (3) | 2024.03.31 |
[즐거운 자바 강의] 섹션4 - 객체지향 문법 (3) (1) | 2024.03.31 |
[즐거운 자바 강좌] 섹션3 - 객체지향문법(2) (0) | 2024.03.31 |