1. 객체지향 프로그래밍
- 데이터와 함수를 하나의 덩어리로 묶어서 생각하는 방법: 캡슐화
public class Circle {
double radius; // data
String color; // data
double getArea() {return 3.14*radius*radius; } // func
}
2. 정보 은닉
- 객체의 외부에서는 내부 데이터와 알고리즘을 볼 수 없게 함
- 공개된 인터페이스를 통해서만 객체에 접근하도록
3. 상속
- 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스) 생성 가능
- 자식 클래스는 부모의 속성과 동작 물려받음
4. 클래스
- 객체에 대한 설계도 (틀)
- 클래스로부터 만들어지는 각각의 객체 -> '인스턴스'
- 하나의 클래스로 여러 인스턴스를 만들어내지만, 인스턴스마다 속성의 값은 다름
public class Circle {
// 필드
public int radius;
public String color;
// 메소드
public double getArea() {
return 3.14*radius*radius;
}
}
5. 객체 생성
- 참조 변수 선언
//Type 변수명
Circle obj;
- 객체 생성
//변수 객체의 참조값
obj = new Circle();
public class CircleTest {
public static void main(String[] args) {
// 참조 변수 선언
Circle obj;
// 객체 생성 & 객체의 참조값 -> 참조 변수에 저장
obj = new Circle();
// 객체의 필드 사용
obj.radius = 100;
obj.color = "blue";
// 객체의 메소드 사용
double area = obj.getArea();
System.out.println("원의 면적= " + area);
}
}
6. 참조 변수
- 객체 를 참조할 때 사용되는 변수 - 객체의 참조값이 저장되어 있음
- 참조값은 일반적으로 객체의 주소
- 자바에서 모든 객체는 new 연산자를 이용해야 생성됨
public class DeskLamp {
// 인스턴스 변수 정의
private boolean isOn;
// 메소드 정의
public void turnOn() { isOn = true; }
public void turnOff() { isOn = false; }
public String toString() {
return "현재 상태는" + (isOn == true ? "켜짐" : "꺼짐");
}
}
public class DeskLampTest {
public static void main(String[] args) {
// 객체 생성
DeskLamp myLamp = new DeskLamp();
// 객체의 메소드 호출
myLamp.turnOn();
System.out.println(myLamp);
myLamp.turnOff();
System.out.println(myLamp);
}
}
7. 메소드 오버로딩
- 이름이 동일한 여러 개의 메소드 작성 가능
- 매개변수의 수, 타입, 순서 등이 달라야 함
public class MyMath {
int add(int x, int y) { return x+y; }
int add(int x, int y, int z) { return x+y+z; }
int add(int x, int y, int z, int w) { return x+y+z+w; }
public static void main(String[] args) {
MyMath obj;
obj = new MyMath();
System.out.println(obj.add(10, 20));
System.out.println(obj.add(10, 20, 30));
System.out.println(obj.add(10, 20, 30, 40));
}
}
8. 생성자
- 객체가 생성될 때 객체를 초기화하는 특수한 메소드
- 중복 정의 가능
class Pizza {
int size;
String type;
public Pizza 90 {
size = 12;
type = "슈퍼슈프림";
}
public Pizza(int s, String t) {
size = s;
type = t;
}
}
public class PizzaTest {
public static void main(String[] args) {
Pizza obj1 = new Pizza();
System.out.println("(" + obj1.type + ", " + obj1.size + ",)");
Pizza obj2 = new Pizza(24, "포테이토");
System.out.println("(" + obj2.type + ", " + obj2.size + ",)");
9. 기본 생성자
- 매개변수 없는 생성자
- 생성자 하나도 정의하지 않으면 컴파일러가 자동으로 기본 생성자 만듦
10. this 참조 변수
- 현재 객체 자신을 가리키는 참조 변수
- 컴파일러에서 자동으로 생성
- 생성자에서 매개 변수 이름과 필드 이름이 동일한 경우에 사용
public Circle (int radius) {
this.radius = radius;
}
11. this()
- 다른 생성자 의미
12. 접근 제어
- private: 클래스 안에서만 접근 가능
- public: 누구나 접근 가능
- protected: 자식 클래스만 접근 가능
- 접근지정자 x (default) : 동일 패키지 안에서만 접근 가능
13. 접근자와 설정자
- 접근자 (getters) 메소드: 필드값 반환
- 설정자 (setters) 메소드: 필드값 설정
- 접근자와 설정자 메소드만을 통해 필드에 접근해야 함!
- 설정자에서 매개변수를 통해 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있음
- 필요할 때마다 필드값을 동적으로 계산하여 반환할 수 있음
- 접근자만 제공 -> 읽기만 가능한 필드 만들 수 있음
- Source 메뉴에서 자동 입력 가능
class Account {
private int regNumber;
private String name;
private int balance;
// 접근자
public String getName() {
return name;
}
// 설정자
public String setName(String name) {
this.name = name;
}
public int getBalance() {
return balance;
}
public int setBalance(int balance) {
this.balance = balance;
}
}
14. 객체의 소멸과 가비지 컬렉션
- 객체 삭제 연산자 없음
- 자동 메모리 시스템 사용: 가비지 컬렉션
- 가비지 컬렉터: 힙 메모리에서 더이상 필요없는 객체를 찾아 지움
- 가비지 컬렉션 요청 -> 모든 다른 애플리케이션 멈춤 -> JVM이 실행 여부 판단
System.gc;
15. 인수전달 방법
- 기본적으로 Call by value
- 객체를 메소드로 전달 -> 객체의 참조값만 복사되어 전달됨
- 참조 변수는 참조값(주소) 갖고 있음
- 배열도 객체 -> 배열 전달은 배열 참조 변수를 복사하는 것
public class ArrayArgumentTest {
public static double minArray(double[] list) {
double min = list[0];
for (int i = 1; i < list.length; i++) {
if(list[i] < min)
min = list[i];
}
return (min);
}
public static void main(String[] args) {
double[] a = { 1.1, 2.2, 3.3, 4.4, 0.1, 0.2 };
double[] b = { -2.0, 3.0, -9.0, 2.9, 1.5 };
double min;
min = minArray(a);
System.out.println("첫번째 배열의 최솟값= " + min);
min = minArray(b);
System.out.println("두번째 배열의 최솟값= " + min);
}
}
// 0.1
// -9.0
16. 정적 멤버
- 여러 개의 객체가 하나의 변수를 공유해야 하는 경우
-> 이러한 멤버를 정적 멤버 (static member) / 클래스 멤버 (class member) 라고 함
- 정적 변수: 클래스 당 하나만 생성되는 변수
- 여러 개가 존재할 수 있음, 한개의 static 변수는 한 번 선언됨
- 클래스를 통한 접근
Television.count = 100;
- 객체를 통한 접근
Television obj = new Televison();
obj.count = 100;
- 정적 메소드: 객체를 생성하지 않고 클래스 이름으로 접근해서 사용 가능
public class Math {
public static double sqrt(double a) {
...
}
}
...
double value = Math.sqrt(9.0); // 클래스.함수명 으로 사용
17. 정적 변수의 활용
- 정적 메소드는 정적 멤버만 사용할 수 있음
class Test {
int a; // 인스턴스 변수
static int b; // 정적 변수
void sub1() { a = 0; } // OK
static void sub2() { a = 0; } // 오류! 정적 메소드에서는 인스턴스 멤버 사용할 수 없음
- 정적 메소드에서 정적 메소드를 호출하거나 정적 멤버를 사용하는건 가능
- 정적 메소드는 this를 사용할 수 없음
class Test {
static int a;
static void sub(int x) { this.a = x; } // 오류!
- main()도 정적 메소드이기 때문에 인스턴스 메소드를 호출할 수 없음
- 정적 메소드는 main()에서 호출 가능!
public class Test {
public static int cube(int x) {
int result = x*x*x;
return result;
}
public static void main(String args[]) {
System.out.println("10*10*10은 " + cube(10)); // 정적 메소드 호출
}
}
18. final 키워드
- 필드에 final을 붙이면 상수가 됨
- static과 동시에 사용하는 경우 많음
public class Car {
static final int MAX_SPEED = 100;
}
- 상수는 클래스 변수로 만들어서 공유하는 것이 메모리 공간 절약
19. 싱글톤 패턴
- 객체 중 전체 시스템을 통틀어서 딱 하나만 존재해야 하는 것들이 있음
- ex) 환경설정 클래스, 네트워크 연결 풀 / 스레드 풀을 관리하는 클래스들
- 싱글톤 패턴은 하나의 프로그램 내에서 하나의 인스턴스만을 생성해야 하는 경우에 사용
class Single {
private static Single instance = new Single();
private Single() { } // 전용 생성자
public static Single getInstance() {
return instance;
}
}
public class SingleTest {
public static void main(String[] args) {
Single obj1 = Single.getInstance();
Single obj2 = Single.getInstance();
System.out.println(obj1);
System.out.println(obj2);
}
}
20. 객체배열
- 객체를 저장하는 배열
- 객체에 대한 참조값 저장
class Rect {
int width, height;
public Rect(int w, int h) {
this.width = w;
this.height = h;
}
double getArea() {
return (double) width * height;
}
}
public class RectArrayTest {
public static void main(String[] args) {
Rect[] list = new Rect[5]; // 객체 배열 생성
for (int i = 0; i < list.length; i++)
list[i] = new Rect(i,i); // 배열에 객체 값 저장
for (int i = 0; i < list.length; i++)
System.out.println(i + "번째 사각형의 면적= " + list[i].getArea());
}
}
/**
0번째 사각형의 면적= 0.0
1번째 사각형의 면적= 1.0
2번째 사각형의 면적= 4.0
3번째 사각형의 면적= 9.0
4번째 사각형의 면적= 16.0
**/
for(int i = 0; i < list.length; i++)
list[i] = new Rect(i, i);
21. 동적 객체 배열
- ArrayList<>
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("홍콩");
list.add("싱가포르");
list.add("괌");
list.add("사이판");
list.add("하와이");
System.out.println("여행지 추천 시스템");
int index = (int)(Math.random()*list.size());
System.out.println("추천 여행지는 " + list.get(index));
}
}
- list.add(); 로 추가
import java.util.ArrayList;
class Person {
String name;
String tel;
public Person(String name, String tel) {
this.name = name;
this.tel = tel;
}
}
public class ArrayListTest2 {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("Anna", "01023459293"));
list.add(new Person("Jane", "01082983491"));
list.add(new Person("Jim", "01012349722"));
list.add(new Person("Emily", "01092938475"));
for (Person obj : list)
System.out.println("(" + obj.name + "," + obj.tel + ")");
}
}
'Software > JAVA' 카테고리의 다른 글
[JAVA] Day6. 추상클래스, 인터페이스, 중첩클래스 (0) | 2022.12.29 |
---|---|
[JAVA] Day5. 상속 (0) | 2022.12.29 |
[JAVA] Day2. 조건문, 반복문, 배열 (0) | 2022.12.27 |
[JAVA] Day1. 자바 기초 (0) | 2022.12.27 |
[JAVA] 예외처리 (0) | 2021.07.22 |