레이블이 자바변수인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바변수인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 27일 일요일

[JAVA다향성재정의]자바 다형성(java polymorphism), 메소드재정의, 다중정의(method overrding, method overloading)

[JAVA다향성재정의]자바 다형성(java polymorphism), 메소드재정의, 다중정의(method overrding, method overloading)
 
1. 다형성이란?
 
서로 다른 객체가 같은 메시지에 대하여 서로 다른 방법으로 응답할 수 있는 기능을 이야기 한다.
의미(semantics)는 하나지만 실제 형태는 여러 가지가 될 수 있다는 말이다. 예를 들면, "열다"는 우리는 충분히 이해할 수 있다. 그러나, 실제적으로 "여는 형태"는 많다. 창문을 여는 형태, 강의실 문을 여는 형태, 현관 문을 여는 형태 등 의미는 하나지만 실제적인 형태는 상당히 많을 수 있는 것이다. 
다형성은 프로그램에서 특별한 연산자나 키워드가 있는 것이 아니며 객체지향 프로그래밍 언어에서 "오버로딩 (overloading)", "오버라이딩 (overriding)"의 형태로 나타난다. 
상위 클래스에 정의된 메소드와 동일한 형태의 메소드를 하위 클래스에 정의
동적 메소드 바인딩에 기반한다.
동적 메소드 바인딩에는 어떤 메소드를 호출할 지 컴파일 시 지정하지 않고 실행  시에 동적으로 결정된다.
코드에는 호출할 주소가 아닌, 어떤 메소드를 호출해야 하는지 전체 이름이 적혀있고 JVM은 이걸 보고 힙영역의 객체를 뒤져 적절한 메소드를 호출한다.
그러므로 어느 객체의 어느 메소드가 호출될 지 컴파일 시에는 알 수 없고 단지 타입 정보에만 의존하여 에러 체킹을 한다.
상위 클래스의 일부 메서드가 하위 클래스에 적합하지 않을 경우 하위 클래스에서 해당 메서드만 재정의
추상클래스 등에서 상속받는 모든 하위클래스에서 반드시  정의해야되는 메서드에 대해 그 프로토타입 만을 추상 메서드로 정의하고 이를 상속하는 클래스에서 메서드 재정의
재사용 가능한 강력한 인터페이스 구축
메서드 오버라이딩되면 Super 클래스의 메서드가 가려지게되고 이 경우 super를 사용하면 Super클래스의 메서드를 사용
 
2. method overriding(메서드 재정의) 규약

인스턴스 메서드일 것(static붙어 있는 메소드는 안된다.)
메서드의 이름, 매개변수개구, 매개변수타입, 리턴형이 일치 할 것
메서드의 접근 제어자가 public 또는 protected 일것
protected : 하위 클래스에서 호출하거나, 오버라이드 할 수 있는 접근제어자. 하위 클래스가 아닌 다른 클래스는 호출하지 못한다.
private 일 경우 재정의 할 수 있다.
 
3. 메소드 중복정의, 다중정의(method overloading)

동일한 클래스 내에서 같은 이름의 메소드를 중복  정의하여 다형성을 지원
메서드 이름은 동일하나 매개변수의 TYPE, 매개변수의 개수가 다를 것
 
4. 메소드 재정의 (method overriding)

상속 관계에 있는 클래스간에 메소드를 중복 정의하여 다형성을 지원
즉, 메소드 오버라이딩을 이용하면 하위 클래스에서 동일 이름의 메소드를 새롭게 정의 가능
매개변수의 형이나 매개변수의 수 모두 동일해야 함

5. 다형성의 개념이 적용되는 곳
 
상속(Inheritance)
중복(다중)정의(Overloading)
재정의(Overriding)
Upcasting(상위클래스로 형변환)
Abstract의 상속과 Interface의 구현
 

[예제]
상속과 메소드 재정의를 이용한 다형성
 
class DrawObj {
 void draw() {}
}
class Circle extends DrawObj {
 void draw() {
  System.out.println("원을 그립니다.");
 }
}
class Line extends DrawObj {
 void draw() {
  System.out.println("선을 그립니다.");
 }
}
......
......
......
DrawObj[] objs = new DrawObj[10];
Objs[0] = new Circle();
Objs[1] = new Line();
Objs[2] = new PolyLine();
Objs[3] = new Rectangle();
. . .
Objs[9] = new Line();
//각 draw메소드가 Circle, Line..에 따라 다르게 표현된다.
for(int i = 0; i < objs.length; i++)
    objs[i].draw();

2013년 10월 24일 목요일

[JAVA TIP]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)

[JAVA TIP]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)
 
예제를 보시면 이해가 되리라 생각 합니다.
참고하시구요, 열공 하세요.
 
//
//  @Java Tip
//  @author 오라클자바커뮤니티, 오엔제이프로그래밍
//  @Desc : java.util.Arrays 클래스의 sort메소드를 이용한 정렬
// 
package onj;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class ArraySortExam {
 public static void main(String[] args) {
  String[] myArray = { "c", "a", "b" };
  // 일단 그냥 출력 해보자. c, a, b 순으로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // Ascending Sort, 오름차순 정렬
  Arrays.sort(myArray);
  // a, b, c로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // 이번에는 내림차순(Descending) 졍렬
  Arrays.sort(myArray, Collections.reverseOrder());
  // c, b, a로 출력
  for (String s : myArray) {
   System.out.println(s);
  } 

2013년 8월 9일 금요일

[오라클자바커뮤니티, 닷넷강좌, 자바교육].NET CLR(Common Language Runtime)

마이크로소프트 닷넷기반의 C#으로 프로그래밍을 하기 위해서는 우선 그 환경(닷넷 프레임웍)에 대해 이해가 우선 해야 합니다. 그래서오늘은 CLR(Common Language Runtime)이라는 것에 대해 알아보도록 하겠습니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




CLR은 하부구조로 OS를 가지며 OS 위에서 닷넷 Application을 실행 할 수 있게 해주는 아주아주 중요한 것입니다. 이것때문에 닷넷 환경하에서 어떠한 언어로 개발하든지 컴파일된 파일은 같은 모양을 가지며 결국 이 컴파일된 파일들은 CLR 위에서 여러가지 라이브러리등을 참고해서 실행 하게 되는 겁니다. 자바라는 언어로 본다면 자바가상머신(JVM) 이라고 보시면 됩니다. 자바에서도 이 JVM때문에 플랫폼 독립적인 자바의 특징, 어떠한 OS 기반위에라도 JVM만 있으면 자바프로그램이 동작하는 것이 가능 했던 겁니다.
아래에서 닷넷 환경 하에서 프로그램이 실행되는 형태를 보도록 하겟습니다. 자바에서는 .java 파일이 .class 파일로 바뀌고 이것이 JVM에 로딩되어 실행되는 구조이죠, 그런다음 JVM에서는 자바바이트 코드를 하나씩 해당 OS의 기계어(Native Code)로 번역을 하는 겁니다. 물론 번역을 그때그때 하면 JIT(Just-In-Time) 이라고 하고 병목현상이 일어날것





CLR에 대해 간단히 설명드리면 아래와 같습니다.
? The CLR defines the Common Type System (CTS)
? All languages built on the CLR use the CTS

? Types are divided into two categories
1. Value types:
- Relatively simple types
- Typically allocated on the stack
2. Reference types:
- More complex types
- Allocated on the heap
- Destroyed through garbage collection
CLR은 CTS라는 것을 정의하는데 무엇인고 하니 C#이든 VB.Net이든 동일한 형태의 데이터 타입을 사용하는 겁니다. 예를들면 System.Int32라는 Class는 int형을 이야기 하는데
(int i=0; 또는 System.Int32 i=0; 둘다 같은 의미 입니다.)
C#이나 VB.Net등 어떠한 닷넷 언어에서든 공통으로 사용한다는 이야기 입니다. 과게에 C언어에서 Int형은 2바이트 또는 4바이트로 고정된것은 아니었습니다. 즉 32비트가 1워드이면 4바이트, 16비트가 1워드이면 2바이트 등으로 타입이 고정되지 않아 타입 안정성이 떨어 졌으니까요. 그래서 닷넷은 공용의 데이터 타입을 정의한거죠...물론 일반적인 원시데이터 타입(int, float, long등)은 Value Type이라고 하여 Stack에 저장되고 객체등은 Reference Type이라고 새서 Heap에 저장 됩니다.
CTS의 구조를 아래에서 보도록 하죠^^; (Value-Type이든 Reference Type이든 모드 객체 입니다. 위에서 말씀드린것과 같이 int 형은 System.Int32라는 클래스 타입이죠)



오늘 자바에서의 JVM과 같은 닷넷에서의 CLR에 대해 살펴 보았습니다. 어렵게 보일지는 모르지만 자바의 특을 어느정도 이해하고 계신다면 닷넷은 껌입니다. 항상 자바+알파 이니까요... 또한 CLR은 BCL(BAse Class Library)라고 해서 닷넷에서 사용되는 1000여가지의 클래스를 지웝합니다. 즉 C#이든 VB.Net이든 이 클래스는 똑같이 가져다 쓸수 있고 이름또한 같이 사용한다는 이야기 입니다. 아래의 예를 비교해 보세요...(결국 같은 Class를 이용하는 겁니다. 참 공부하기 편하죠^^;)

C# .Net 에서 MDB에 접근할려면 아래와 같이 합니다.

string CnString ="Data Source=student.mdb; Provider=Microsoft.Jet.OLEDB.4.0;"; OleDbConnection objConnection = new OleDbConnection (CnString);
objConnection.Open();
한편 VB.Net에서는
dim strConnection = "Data Source=student.mdb; Provider=Microsoft.Jet.OLEDB.4.0;"
dim objConnection as new OLEDBConnection(strConnection)
objConnection.open()







2013년 8월 8일 목요일

[오라클자바커뮤니티강좌교육]JAVA instance, static class 변수

이번 강좌에서는 자바에서의 변수에 대해 알아 보도록 하죠...



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




자바에서의 변수는 지역변수(local variables), 매개변수(parameters),클래스 범위에서 선언 한 인스턴스 변수(instance fields), 클래스 변수(class fields) 등으로 구분 할 수 있습니다. 물론 인스턴스 변수나 클래스변수나 전부 어떤 메소드(함수)안에서 선언되는 것이 아니라 메소드 밖에 선언되는 변수 입니다. 말이 틀리지만 그 쓰임새 또한 대단히 다르니 잘 아래의 내용을 발 봐두어야 합니다.

전 가끔 붕어빵 찍는 틀클래스로 비유하고 그 틀에 의해 찍혀 나오는 각각의 붕어(인스턴스)객체라고 비유 합니다. 붕어빵 찍는 클이 클래스라고 했으니 클래스 변수 붕어빵 찍는 틀과 관련이 있는 거죠... 즉 찍혀 나온 모든 붕어빵들이 공유하는 전역 변수로서 역할을 하며 또한 붕어를 만들어 내지 않아도 붕어빵 찍는 틀애 있는 것이니까 New 하지 않아도(붕어를 찍어 내지 않아도) 접근이 가능하죠... 즉 클래스 변수는 클래스이름.클래스변수명 으로 접근이 가능 한겁니다. 각각의 붕어를 찍어 낼때 팥의 양을 조절이 가능하다고 가정 할때 클래스변수가 아닌 인스턴스 변수팥의양을 둘 수가 있겠죠... 이건 붕어빵 찍는 틀(클래스)과 관련이 있는 변수가 아니라 찍혀 나온 붕어(인스턴스)들에 관련이 있는 변수 이므로 인스턴스 변수라고 하고 반드시 붕어를 찍어 낸 후(New 한 후) 접근이 가능한 변수가 되는 겁니다. 이해가 되시나요? 아래를 보시면서 다시 한번 정리하시기 바랍니다. 그래서 static이라는 키워드를 보는 순간 전역변수, 초기화가 한번만(붕어빵 찍는 틀과 관련이 있으므로), New 하지 안아도(붕어를 찍어 내지 않아도) 접근이 가능하며 즉 클래스이름.변수명... 잘 기억하시기 바랍니다.

클래스 변수

클래스의 인스턴스(객체)가 아니라 그것이 정의된 클래스와 연관된다.
static 한정자는 이 변수(필드)가 클래스필드 임을 의미
상수를 정의하는것이 클래스필드의 일반적인 사용이다.public static final double PI=3.14159;
정적필드의 복사본은 오직 한 개 존재하며 전역변수로 사용 된다.
같은 클래스 내부에서는 PI로 지칭되며 클래스 외부에서 해당 변수(필드)를 유일하게 지칭하기 위해서는 클래스명.PI로 인스턴스를 생성하지 않고도 직접 참조가 가능(물론 인스턴스를 만든 후 객체참조변수.PI형태의 참조도 가능하다.)


인스턴스 변수

static으로 선언되지 않은 모든 변수(필드)는 인스턴스 변수 입니다. public double r;
클래스의 인스턴스와 연관, 생성된 모든 객체는 자신만의
복사본을 가진다.
클래스 내부에서 이름 하나만으로 지칭된다
public double r;
public double area() {
return PI * r * r;
}
클래스 외부에서는 클래스를 인스턴스화한 객체.변수명 형
태로 사용한다. 인스턴스 필드(변수)의 값은 한객체를 다른
객체와 구분한다.
Circle c = new Circle(); c.r=2.0;
Circle c1 = new Circle(); c1.r=5.0;