객체지향 프로그래밍
3.1.1 객체와 클래스 개념 용어 정리 객체(object) 추상화(abstraction) 클래스(class) 실세계 혹은 인간의 생각 속에 존재하는 사물 혹은 개념 추상화(abstraction) 객체들의 공통된 특성을 파악하고, 불필요한 특성을 제거하는 과정 클래스(class) 추상화를 통해서 객체들의 공통된 사항을 모아놓은 것 멤버 필드(속성) 클래스의 특성 중에서 변수 혹은 값으로 표현할 수 있는 것 메소드(멤버 함수, 행위) 클래스의 특성 중에서 함수로 표현할 수 있는 것 캡슐화(encapsulation) 클래스의 특성을 외부에서 접근하지 못하도록 한 것
3.1.1 객체와 클래스 개념 추상화
3.1.1 객체와 클래스 개념 객체지향 프로그래밍의 장점 생산성 향성 자연적인 모델링 재사용 유지보수의 용이성 객체를 하드웨어의 IC처럼 재사용 자연적인 모델링 보통 사람들의 생각을 프로그래밍 언어로 표현 재사용 상속 및 결합(composition)을 통한 코드 재사용의 극대화 유지보수의 용이성 함수 수정에 있어 주변에 미치는 영향이 최소화됨
3.1.1 객체와 클래스 개념 실세계 객체와 프로그램 세계의 클래스
3.1.1 객체와 클래스 개념 프로그램 세계에서 클래스와 객체 객체 클래스 Object = Data + Methods Object = 클래스의 인스턴스 (an instance of a class) 클래스 Class = 객체의 타입 (description of a type of Object) 프로그램 Program = 서로 협력하는 객체들의 집합 (a set of Objects invoking each other Methods)
3.1.1 객체와 클래스 개념 메시지 패싱
3.1.2 클래스와 객체 만들기 추상화 관점
3.1.2 클래스와 객체 만들기 실세계의 펜과 프로그램 펜의 유사성 공장 만드는 단계 클래스 -> 공장 ,틀, 자료형 클래스 -> 공장 ,틀, 자료형 클래스를 정의할 때 사물(객체, 물건)의 중요하고 필요하다고 판단되는 특성과 기능만 추출해서 표현한다. 물건 만드는 단계 new 라는 명령어를 사용, new 다음에 클래스(공장) 이름과 같은 함수 기술 이 때 만들어진 물건은 변수에 저장되고, 변수의 타입은 물건의 종류가 될 것이다. 예: Pen mypen = new Pen(); 만들어진 물건을 사용 단계 변수에 점(.)을 이용하여 프로그램에서 만들어진 물건을 사용한다. 예: mypen.write();
3.1.2 클래스와 객체 만들기 프로그램에서 클래스를 정의하고 사용하는 단계
3.1.2 클래스와 객체 만들기 예제: Pen.java 예제: PenUser.java 결과 1 class Pen { 2 String color; 3 int price; 4 5 void write() { 6 System.out.println("Hello"); 7 } 8 } 1 class PenUser { 2 public static void main(String args[]) { 3 Pen mypen = new Pen(); 4 mypen.write(); 5 } 6 } 결과 C:\> java PenUser Hello
3.1.3 레퍼런스 타입 레퍼런스와 포인터
3.1.3 레퍼런스 타입 객체 생성 방법(C++ vs. Java)
3.1.3 레퍼런스 타입 메모리 영역 1 int a = 100 ; 2 Car mycar; 3 mycar = new Car(); 4 Car yourcar = mycar;
3.1.3 레퍼런스 타입 ==과 equals() == 연산자와 equals() 메소드의 차이점 두 연산자의 차이점의 예 == 연산자는 두 변수의 값이 같은가를 물어본다 equals() 메소드는 객체의 내용이 같은가를 물어본다. == 연산자는 기본 자료형이나 레퍼런스에 사용 equals() 메소드는 레퍼런스 타입에서만 사용 두 연산자의 차이점의 예
3.1.3 레퍼런스 타입 예제: Equal.java 1 public class Equal { 2 public static void main(String args[]) { 3 String a = new String("abc"); 4 String b = "abc"; 5 String c = b; 6 String d = a; 7 8 StringBuffer e = new StringBuffer("abc"); 9 StringBuffer g = e; 10 11 if(a = = b) { 12 System.out.println("a= =b"); 13 } 14 // if(a = = e) { // 컴파일 에러 15 // System.out.println("a= =e"); 16 // } …………...
3.1.3 레퍼런스 타입 결 과 20 if(b.equals(a)) { 21 System.out.println("b.equals(a)"); 22 } 23 if(b.equals(e)) { 24 System.out.println("b.equals(e)"); ……………... 결 과 C:\> java Equal c==b b.equals(a)
3.2 자바 클래스 자바 클래스 작성 문법 [ classmodifier ] class name [ <typeparameter> ] [ extends name ] [ implements name [ , name ] ] { [[ constructormodifier ] name ( argumentlist ) [ throws name [ , name ] ] { } ] [ fieldmodifier ] type name [ = initialvalue ] ; [ methodmodifier ] [ <typeparameter> ] returntype name ( argumentlist ) [ throws name [ , name ] ] { } }
3.2 자바 클래스 모디파이어 종류
3.2 자바 클래스 예제: Circle.java 1 class Circle { 2 int r; 3 4 public double getCircumference() { 5 return 3.14*2*r; 6 } 7 8 public double getArea() { 9 return 3.14*r*r; 10 } ……
3.2 자바 클래스 예제: CircleUser.java 결과 1 class CircleUser { 2 public static void main(String args[]) { 3 Circle c = new Circle(); 4 c.setRadius(7); 5 System.out.println("원 둘레:"+ c.getCircumference()); 6 System.out.println("원 면적:"+ c.getArea()); …… 결과 C:\> java CircleUser 원 둘레:43.96 원 면적:153.86
3.3.1 생성자 생성자 클래스 이름과 동일한 이름을 갖는 함수 생성자의 리턴 타입은 기술하지 않음 역할 - 멤버 필드의 초기화 생성자가 없는 클래스는 디폴트 생성자를 가지고 있다
3.3.1 생성자 예제: Circle.java 예제: CircleUser.java 1 class Circle { …… 8 public Circle(int r) { 9 this.r = r; 10 } 1 class CircleUser { 2 public static void main(String args[]) { 3 Circle c = new Circle(7); 4 System.out.println("원 둘레:"+ c.getCircumference()); 5 System.out.println("원 면적:"+ c.getArea());
3.3.2 this this 예제 : This.java 클래스 내에서 자기 자신을 가리키는 레퍼런스 static으로 선언된 메소드에서는 사용될 수 없다. 두 가지 목적으로 사용 자기 자신의 멤버 필드나 메소드를 명확히 지시하기 위해서 사용 객체 전체를 함수의 매개변수로 전달해야 하는 경우에 사용 예제 : This.java 9 void a (int a) { 10 this.a = a; 11 b.doJob(this); 12 } 13 }
3.3.3 this() this( ) 예제: Circle3.java 생성자가 많은 경우 매개 변수에 의해 생성자가 구분 생성자에서 this()는 맨 처음 부분에 나와야 한다. 예제: Circle3.java 4 public Circle() { 5 this(0); 6 } 8 public Circle(int r) { 9 this.r = r; 10 }
3.3.5 패키지와 import 패키지(package) 유사한 클래스들의 모임 package 문장 기술 package package_name ; 특징 package 문장을 사용하지 않는 경우에는 디폴트 패키지에 속하게 된다. 패키지 내에서 클래스들은 서로 자유롭게 다른 클래스들을 참조 다른 패키지의 클래스를 사용하기 위해서는 import 문을 사용 import package_name.class_name ; 패키지 경로는 클래스 파일의 디렉토리 경로와 같다. 예) java.awt.Graphics --> java/awt/Graphics import 문장을 사용하지 않고 다른 패키지의 클래스를 참조하기 위해서는 패키지 이름과 클래스 이름을 같이 사용 예) java.awt.Graphics g ;
3.3.5 패키지와 import 예제: ColorPen.java 저장 및 컴파일 저장 컴파일 C:\java2\src\ch3\com\coding_free\java2 컴파일 C:\> javac -d . com/coding_free/java2/ColorPen.java 1 package com.coding_free.java2; 2 3 public class ColorPen { 4 private String color; 5 private int price;
3.3.5 패키지와 import 예제: ColorPenUsre.java 저장, 컴파일 및 실행 저장 : C:\java2\src\ch3\penna 컴파일 : C:\> javac -d . penna/ColorPenUser.java 실행 : C:\> java penna.ColorPenUser 1 package penna; 2 3 import com.coding_free.java2.*; 4 5 class ColorPenUser { 6 public static void main(String args[]) { 7 ColorPen mypen = new ColorPen();
3.3.5 패키지와 import Static import 예제: StaticImportTest.java 형태 예제: StaticImportTest.java import static TypeName.Identifier ; import static TypeName.* ; 1 import static java.lang.System.*; 2 3 public class StaticImportTest { 4 public static void main(String args[]) { 5 out.println("Hello World");
3.4 public 클래스 public 클래스의 의미 public으로 선언된 경우 public으로 선언되지 않은 경우 같은 패키지 내에서 자유롭게 사용. 다른 패키지에서도 자유롭게 사용. public으로 선언되지 않은 경우 같은 패키지 내에서는 자유롭게 사용 다른 패키지에서 접근 시 에러가 발생
3.5 가시성 가시성 가시성 종류 멤버 필드와 메소드에 적용 public protected package private 클래스 내외 어느 곳에서나 접근이 가능 protected 같은 패키지 내에 있는 클래스들은 모두 접근 가능 다른 패키지의 클래스들은 이 클래스로부터 상속받은 경우에만 접근 가능 package 아무 것도 기술하지 않음 같은 패키지 내에서는 자유롭게 접근할 수 있으나, 패키지 외부에서는 접근할 수 없음 private 클래스 내부에서만 접근 가능
접근 수정자 같은 클래스 같은 패키지 서브클래스 모든 클래스 접근 수정자 같은 클래스 같은 패키지 서브클래스 모든 클래스 private package protected public O X
3.5 가시성 동일 패키지 외부 패키지
3.6 transient, volatile 필드 transient 필드 예 멤버필드가 객체의 영속적인 상태에 일부분으로 포함되지 않는다 예 다음의 Point 클래스가 시스템 서비스에 의해 영속적인 메모리에 저장될 때 transient 부분을 제외한 x, y 부분만 저장됨을 의미 class Point { int x, y; transient float rho, theta; }
3.6 transient, volatile 필드 volatile 필드 예 쓰레드 간에 공유되는 데이터의 일관성 유지를 위해 사용 volatile로 선언된 변수는 일관성을 유지하면서 내용이 업데이트 됨 volatile로 선언된 변수의 내용을 변경하는 경우에는 락(lock)이 걸린다고 볼 수 있다. 예 class Test { static volatile int i = 0, j = 0; static void one() { i++; j++; } static void two() { System.out.println("i=" + i + " j=" + j); …
3.7 오버로딩 (overloading) 오버로딩 ad-hoc polymorphism이라고도 함 동일한 연산자가 자료의 타입에 따라 다른 작업을 수행하는 것 함수 오버로딩 동일한 이름을 가지는 함수가 여러 개 존재 가능 내부적으로는 다른 작업을 하더라도 의미 면에서 같다면 동일한 함수 이름을 사용 한 클래스 내에서 함수 이름은 동일, 함수의 매개변수는 달라야 함 함수 시그내쳐 = 함수 이름 + 매개 변수 개수 + 매개 변수 타입
3.7 오버로딩 (overloading) 예제: Overloading.java 1 class Overloading { 2 public void say() { … 6 public void say(String msg) { 10 public void say(String msg, int n) { 16 public static void main(String args[]) { 17 Overloading a = new Overloading(); 18 a.say(); 19 a.say("How are you ?"); 20 a.say("I am fine.", 3);
3.8.1 배열 배열 자바에서 배열은 동적으로 생성할 수 있는 클래스 C 언어와 유사하게 사용 예: new 를 이용해서 생성해야 사용 가능 C 언어와 유사하게 사용 예: int k[ ]; // int 배열을 선언. int[ ] k 와 동일 k = new int[10]; 배열의 인덱스는 0 ~ length - 1까지 사용 배열 초기화 int[] k = {1, 2, 3};
3.8.1 배열 예제: Gauss.java 1 class Gauss { 2 public static void main(String[] args) { 3 int[] ia = new int[101]; 4 for (int i = 0; i < ia.length; i++) 5 ia[i] = i; 6 7 int sum = 0; 8 for (int i = 0; i < ia.length; i++) 9 sum += ia[i]; 10 11 System.out.println(sum);
3.8.1 배열 다차원 배열 예 다차원 배열에서 C 언어와 다른 점 (2차원 배열을 예) 예 : 4 x 5의 격자 모양의 배열 int twoDarray[][]; String threeDarray[][][]; 다차원 배열에서 C 언어와 다른 점 (2차원 배열을 예) C 언어에서는 배열이 격자 모양으로 가로 세로의 크기가 고정 자바에서는 다양한 형태의 배열을 가질 수 있다. 예 : 4 x 5의 격자 모양의 배열 twoDarray = new int[4][5]; 예 : 전체 배열의 크기는 4로 만들고, 배열의 각 컴포넌트는 필요한 경우에 동적으로 크기를 결정 twoDarray = new int[4][];
3.8.1 배열 예제: MultiDarray.java 3 char stars[][]; 4 5 stars = new char[6][]; 6 for(int i=0; i < stars.length; i++) { 7 stars[i] = new char[i+1]; 8 for(int j=0; j < stars[i].length; j++) { 9 stars[i][j] = '*'; 10 } 11 }
3.8.2 레퍼런스와 포인터 레퍼런스와 포인터 차이점