6 minute read

1. 객체 지향 프로그래밍

다양한 기능을 하는 소프트웨어 객체들을 조합하여 기능을 구현하는 기법

객체

객체는 상태와 동작을 가지고 있고 소프트웨어에서 각각 필드와 메소드로 표현할 수 있다.

  • 객체의 상태(state): 객체의 속성
  • 객체의 동작(behavior): 객체가 취할 수 있는 동작(기능, 행동)
  • 필드(field): 객체 안의 변수
  • 메소드(method): 객체 안의 함수

절차 지향 프고그래밍과 객체 지향 프로그래밍

<프로그래밍 기법의="" 발전=""> 어셈블리 -> 절차 지향 -> 객체 지향 -> 함수형 |절차 지향 프로그래밍|객체 지향 프로그래밍| |---|---| |절차 지향에서 사용되는 방법으로 복잡한 문제를 점점 더 작은 문제로 분해하는 방법(하향식 설계, top down design)|데이터와 함수를 하나의 덩어리(객체)로 묶는 방법(캡슐화)| 절차 지향 프로그래밍은 데이터와 함수가 분리된다는 중요한 단점이 있다. 구현 방식에 관계 없이 기본적인 사양(인터페이스)을 만족하는 객체로 프로그램을 구성하자.(객체 지향이 나오게 된 동기) 연구가 진행될수록 관련 있는 함수와 데이터를 묶어서 생각해야 한다는 점이 맹백해졌다. ### 객체 지향 프로그래밍의 특징 ### 정보 은닉 ### 상속 ### 다형성 ### 추상화 ## 2. 클래스와 객체 만들기 ### 클래스란? - 클래스: 객체에 대한 설계도(형틀(template) 또는 청사진(Blueprint)) - 인스턴스: 클래스로부터 만들어지는 각각의 객체 - 하나의 클래스로 여러 개의 인스컨스를 찍어내지만 인스턴스마다 속성의 값은 다르다. ### 클래스 작성 - 클래스의 멤버(member): 객체의 속성을 나타내는 필드와 객체의 동작을 나타내는 메소드 - 필드: 객체 안에 정의된 변수 - 메소드: 클래스 안에 정의된 함수 - 하나의 소스 파일에는 하나의 클래스만을 넣는 것이 원칙이다. - 클래스의 또 다른 의미: 공통되는 것들을 묶어서 그 유형에 이름을 붙인 것(유형, 부류) ### 객체 생성 1. 참조 변수 선언한다. 2. new 연산자를 사용하여 객체를 생성하고 객체의 참조값을 참조 변수에 저장한다. new 연산자는 객체를 히프 메모리에 생성한 후 객체의 참조값을 반환한다. 3. 객체의 필드와 메소드를 사용한다. 점(.)을 사용하여 객체의 필드나 메소드에 접근한다. ```java Circle obj; obj = new Circle() obj.radius = 100; obj.color = "blue"; double are = obj.getArea(); ``` ### 참조 변수 - 자바에서는 변수를 기초 변수과 참조 변수로 나눌 수 있다. - 기초 변수(primitive variable): int, float, char 등의 기초 자료형의 값을 저장하는 변수 - 참조 변수(reference variable): 객체를 참조할 때 사용되는 변수로서 객체의 참조값(객체의 주소)이 저장되는 변수 예제 4-1 DeskLamp 클래스 작성하고 객체 생성해보기 ```java public class DeskLamp { // 인스턴스 변수 정의 private boolean isOn; // 켜짐이나 꺼짐과 같은 램프의 상태 // 메소드 정의 public void turnOn() { isOn = true; } public void turnOff() { isOn = false; } public String toString() { return "현재 상태는 " + (isOn == true ? "켜짐" : "꺼짐"); } } ``` ````java public class DeskLampTest { public static void main(String[] args) { Practice myLamp = new Practice(); myLamp.turnOn(); System.out.println(myLamp); myLamp.turnOff(); System.out.println(myLamp); } } /* 현재 상태는 켜짐 현재 상태는 꺼짐 */ ```` 예제 4-2 Box 클래스 정의하고 객체 생성하기 ````java class Box { int width; int length; int height; double getVolume() { return (double) width * length * height; } public class BoxTest { public static void main(String[] args) { Box b; b = new Box(); b.width = 20; b.length = 20; b.height = 30; System.out.println("상자의 가로, 세로, 높이는 " + b.width + b.length + b.height + "입니다."); System.out.println("상자의 부피는 " + b.getVolume() + "입니다."); } } } ```` 예제 4-3 Television 클래스 작성하고 생성해보기 ````java public class Television { int channel; int volume; boolean onOff; public static void main(String[] args) { Television myTv = new Television(); myTv.channel = 7; myTv.volume = 10; myTv.onOff = true; Television yourTv = new Television(); yourTv.channel = 9; yourTv.volume = 12; yourTv.onOff = true; System.out.println("나의 텔레비전 채널은 " + myTv.channel + "이고 불륨은 " + myTv.volume + "입니다."); System.out.println("너의 텔레비전 채널은 " + yourTv.channel + "이고 볼륨은 " + yourTv.volume + "입니다."); } } ```` ## 3. 생성자와 메소드 오버로딩 ### 메소드 오버로딩 - 메소드 오버로딩(method overloading): 프로그래밍에서 동일한 이름의 메소드를 여러 개 정의하는 것 - 자바에서 메소드 오버로딩을 사용할 때는 매개 변수를 다르게 하여야 하며 매개변수로 메소드를 구분한다. ````java 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)); } } ```` ### 생성자 - 생성자(constructor): 객체가 생성될 때 객체를 초기화하는 특수한 메소드 ````java class Pizza { int size; String type; public Pizza() { 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 + ",)"); } } /* (슈퍼슈프림 , 12,) (포테이토 , 24,) */ ```` 예제 4-4 생성자 만들어보기 ```java ``` ### 기본 생성자 ### 기본 생성자가 추가되지 않는 경우 ### this 참조 변수 - this: 객체 자신을 가리키는 참조 변수 ### this() ### this 사용 시 주의 사항 ## 4. 접근 제어 ### 자바의 접근 제어 지정자 ### 접근자와 설정자 ### 접근자와 설정자를 사용하는 이유 ## 5. 무엇을 클래스로 만들어야 할까? ### UML(Unified Modeling Language) ### 의존 관계 --- ## 1. 객체의 생성과 소멸 ### 참조 변수와 대입 연산 ### 객체의 소멸과 가비지 컬렉션 - 가비지 컬렉션(garbage collection): 히프 메모리에서 필요 없는 객체를 찾아 지우는 자동 메모리 삭제 시스템 - 참조하는 변수가 없는 객체는 가비지 컬렉션의 후보다. ```java Television tv1 = new Television(); Television tv2 = new Television(); tv2 = tv1; ``` ### 가비지 컬렉션 모든 가비지 컬렉터의 기본 프로세스 1. 참조되지 않은 객체를 식별한다. 2. 표시된 객체를 삭제한다. 3. 새 객체에 메모리를 순차적으로 할당하기 위해 히프 메모리를 압축한다. ### 가비지 컬렉션 요청 ## 2. 인수 전달 방법 - 값에 의한 호출(call by value): 메소드로 인수가 전달되는 방법 ### 기초형 값이 전달되는 경우 - 전달하는 인수가 기초형 변수면 호출자가 전달하는 인수의 값이 매개 변수로 전달된다. ### 객체가 전달되는 경우 - 객체를 메소드로 전달하면 객체의 참조값이 전달된다. 예제 5-1 ```java class Pizza { int radius; Pizza(int r) { radius = r; } Pizza whosLargest(Pizza p1, Pizza p2) { return p1.radius > p2.radius ? p1 : p2; } } class PizzaTest { public static void main(String[] args) { Pizza obj1 = new Pizza(20); Pizza obj2 = new Pizza(18); Pizza largest = obj1.whosLargest(obj1, obj2); System.out.println(largest.radius + "인치 피자가 더 큼."); } } ``` ### 배열이 전달되는 경우 - 배열도 객체이므로 배열을 메소드의 인자로 전달하면 참조값이 복사된다. 예제 5-2 ```java import java.lang.reflect.Array; public class PizzaTest { 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); } } ``` ## 3. 정적 멤버 ### 정적 멤버 - 정적 멤버(static member 또는 클래스 멤버(class member)): 여러 객체가 공유하는 하나의 변수 - 필드를 정의할 때 앞에 static 키워드를 붙이면 정적 멤버가 된다. ### 인스턴스 멤버 vs 정적 멤버 - 클래스의 멤버는 인스턴스 멤버와 정적 멤버로 나뉜다. |인스턴스 멤버|정적 멤버| |---|---| |객체마다 별도록 생성하고 독립된 기억 공간을 갖어 서로 다른 값을 갖는 변수|동일한 클래스로 생성된 모든 객체들이 공유하는 하나의 멤버| |객체 유무|접근 방법| |---|---| |객체가 없는 경우|정적 변수는 객체 없이도 접근할 수 있다. 정적 변수는 객체가 없다면 클래스 이름 뒤에 점 연산자(.)를 붙여 접근한다.| |객체가 있는 경우|정적 변수가 정의된 클래스의 어떤 객체를 통해서도 정적 변수에 접근할 수 있다. 객체가 있다면 객체의 있다면 객체 뒤에 점 연산자를 붙여 접근한다.| - 정적 변수는 클래스당 하나만 생성할 수 있다. ### 정적 변수의 생성 시기 - 인스턴스 변수는 객체와 함께 생성되고 소멸된다. - 정적 변수는 자바 가상 기계가 적재되는 순간 생성되며 프로그램이 종료되는 순간 소멸된다. 예제 5-3 ```java class Pizza { private String topping; public static int count = 0; public Pizza(String topping) { this.topping = topping; count++; } } public class PizzaTest { public static void main(String args[]) { Pizza pz1 = new Pizza("Cheese"); Pizza pz2 = new Pizza("Pepperoni"); Pizza pz3 = new Pizza("Super supreme"); System.out.println("판매된 피자 수: " + Pizza.count); System.out.println("판매된 피자 수: " + pz2.count); } } /* 판매된 피자 수: 3 판매된 피자 수: 3 */ ``` ### 정적 메소드 ### 정적 변수의 활용 ### final 키워드 ### 정적 블록 ## 4. 객체 배열

Categories:

Updated: