레이블이 자바반복문인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바반복문인 게시물을 표시합니다. 모든 게시물 표시

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월 19일 토요일

JAVA JNDI를 이용한 DNS 서비스 구현 JNDI란 자바로 만들어진 프로그램이 Naming 및 Directory 서비스에 접근할 수 있도록 제공되는 API 입니다.

JAVA JNDI를 이용한 DNS 서비스 구현

 JNDI란 자바로 만들어진 프로그램이 Naming 및 Directory 서비스에 접근할 수 있도록 제공되는 API 입니다.
 
즉 자바 응용 프로그램이 어느 위치에 있든지 필요한 자바 객체들을 검색할 수 있는 것입니다. EJB 환경에서는 JNDI를 이용해 EJB Home 객체를 얻어낸 후 이를 이용해 Java Beans 객체를 생성하거나 접근하게 됩니다.
 
JNDI는 DNS(Domain Name System), COS(Common Object Services) 등의 네이밍 서비스 표준과 LDAP(Lightweight Directory Access Protocol), NDS(NetWare Directory Service), NIS(Netware Information System) 등 API를 제공 합니다.
 
참고로 JDK1.4 부터는 JNDI 서비스 프로바이더에 DNS Service Provoder를 제공하여 DNS 서비스를 통해 네이밍 서비스를 받을 수 있도록 지원 했는데 아래는 그 예제 입니다.
 
아래예제는 www.onjprogramming.co.kr에 대한 DNS 서비스를 받아 오는 예제 입니다.
 

import java.util.Hashtable;
import javax.naming.directory.*;
import javax.naming.NamingEnumeration;
public class JNDIExample {
 public static void main(String[] args) {
  Hashtable h = new Hashtable();
  h.put("java.naming.factory.initial","com.sun.jndi.dns.DnsContextFactory");
  h.put("java.naming.provider.url","dns://ns.dacom.co.kr");
  
  try {
   //DirContext 초기화
   DirContext context = new InitialDirContext(h);
   
   //DNS질의 결과를 받아 오자...
   Attributes attribute = context.getAttributes("www.onjprogramming.co.kr");
   
   //질의 결과 출력
   NamingEnumeration ne = attribute.getAll();
   System.out.println("www.onjprogramming.co.kr --> ");
   while(ne.hasMoreElements()) {
    System.out.println(ne.next());
   }
  }
  catch(Exception e) {
   e.printStackTrace();
  }
  
 }
}
 
[결과]
java.sun.com --> 
A: 209.249.116.141

2013년 8월 5일 월요일

(오라클자바교육,ORACELJAVA강좌)JAVA Swing과 JDBC(오라클)를 이용한 예제

//오라클의 EMP Table의 데이터를 가지고 화면에 뿌리는 예제
//이름을 입력하고 Enter Key를 누르면 JDBC를 이용하여  데이터를 가지고 옵니다.


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


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.sql.*;

class DBTest {
        JTextField name;    JPasswordField tel;  JTextField addr;
        public DBTest() {
                JFrame f = new JFrame();
                Container cp = f.getContentPane();
                cp.setLayout(new FlowLayout());
                name = new JTextField("",10);
                name.setCaretColor(Color.blue);
                tel  = new JPasswordField("",10);
               
                                tel.setEditable(false);
                addr = new JTextField("",10);
                addr.setEditable(false);
                cp.add(new JLabel("성명 : "));        cp.add(name);
                cp.add(new JLabel("전화번호 : ")); cp.add(tel);
                cp.add(new JLabel("주소 : "));        cp.add(addr);

                name.addActionListener( new ActionListener()
                        {
                                public void actionPerformed(ActionEvent ae) {
                                        dataGet();
                                }
                        }
                );
                f.setSize(600, 100);                f.setVisible(true);
        }
       
                public static void main(String[] args) {
                new DBTest();       
        }

        public void dataGet() {
                Connection con=null;
                Statement stmt=null;
                ResultSet rs=null;
                try {
              Class.forName("oracle.jdbc.driver.OracleDriver");                       
                  con = DriverManager.getConnection("jdbc:oracle:thin:@***.***.***.***:1521:WINK", "test", "test");
                  stmt = con.createStatement();
                  rs = stmt.executeQuery("select tel, addr from emp where name = " + "'" + name.getText().trim() + "'");
                  if (rs!=null) {

                                            rs.next();
                          tel.setText(rs.getString("tel"));
                          addr.setText(rs.getString("addr"));
                  }
                }
                catch(Exception e) {System.out.println(e);}
                finally {
                        try        {
                                if (con != null) {con.close();        }
                        }
                        catch (Exception e){}
                }
        }
}


2013년 8월 1일 목요일

(Call By Reference)메소드로 객체가 전달되는 방식(Pass-by-Reference)

메소드롤 객체등이 전달되는 경우엔 참조가 전달된다...
아래의 예제를 이해하자!~

class MethodObject { 
      int i; 
      public MethodObject() { 
          i=10;
      }
      void testMethod2(MethodObject s1) { 
          //이메소드는 i값을 29로 바꾸는 메소드라고 가정
          s1.changeI(29); 
      }
      void changeI(int i) {
          this.i = i;
      }
      public static void main(String[] args) {
          MethodObject s = new MethodObject();
          System.out.println(s.i);
          s.testMethod2(s);
          System.out.println(s.i);
    }
}

자바의 반복문

/* 인수로 숫자를 입력받아 그 수까지의 팩토리얼을 계산하는 프로그램 */
public class FactorialFor {
public static void main(String[] args) {
long fact=1;
if (args.length<1) {
System.out.println("Usage : java Factirial Number");
System.exit(1);
}
for(int i=Integer.parseInt(args[0]);i>=1;i--) {
for(int j=1;j<=i;j++) {
fact *= j;
}
System.out.println(i+"! = " + fact);
fact = 1;
}
}
}


/* 인수로 숫자를 입력받아 그 수까지의 팩토리얼을 계산하는 프로그램 */
public class FactorialWhile {
public static void main(String[] args) {
long fact=1;
if (args.length<1) {
System.out.println("Usage : java Factirial Number");
System.exit(1);
}
int i = Integer.parseInt(args[0]); int j=1;
while(i>=1) {
while(j<=i) {
fact *= j; j++;
}
System.out.println(i+"! = " + fact);
fact = 1; i--; j=1;
}
}
}


public class FactorialDoWhile {
public static void main(String[] args) {
long fact=1;
if (args.length<1) {
System.out.println("Usage : java Factirial Number");
System.exit(1);
}
int i = Integer.parseInt(args[0]); int j=1;
do {
do {
fact *= j; j++;
} while(j<=i);
System.out.println(i+"! = " + fact);
fact = 1; i--; j=1;
} while(i>=1);
}
}


/* 소수 찾기 ( 주어진 갯수만큼 ...) */
public class Primes {
public static void main(String[] args) {
//소수 20개를 찾아라. 루프를 어디까지 돌릴지는 모른다. 
int value=20; 
            outerLoop:
        //2부터 계속돌자 ,, 
for(int i=2;;i++) {
    for(int j=2;j<=i-1;j++) {
          if (i%j==0){
              continue outerLoop;
          }
    }
    //소수일 경우만 이리온다.
    System.out.println(i);
    if (--value==0) {
break outerLoop; 
    }
}
}
}