2008. 8. 18. 23:46

Chap 7. 조인

외래키는 중복 될 수 있다.

EQUI JOIN
조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법
주의 사항 : 컬럼의 이름이 같을 경우, 혼돈이 오기 때문에 컬럼명 앞에 테이블명을 기술한다.

ex )                                                 
select *                                            deptno(공통) 컬럼을 중심으로
from emp, dept                                   emp테이블과 dept테이블을 조인해서
where emp.deptno = dept.deptno;        결과를 출력

특정 컬럼을 추출하기 위해서는
select ename, dname                         emp 테이블의 ename(이름),
from emp, dept                                   dept 테이블의 dname(부서명)을
where emp.deptno = dept.deptno;         deptno(공통) 컬럼을 중심으로 출력

별칭 부여
select e.ename, d.dname, e.deptno, d.deptno
from emp e, dept d
where e.deptno=d.deptno;
emp테이블을 e(별칭)로 dept테이블을 d(별칭)로 하여 해당 테이블의 컬럼을
e.ename, d.dname로 명시하고 결과값을 출력

EQUI JOIN에 AND 연산을 추가하여 검색
select ename, dname                       emp 테이블의 이름이 SCOTT인 사람의
from emp e, dept d                           이름과 부서명을 출력
where e.deptno=d.deptno
and e.ename='SCOTT';

NON-EQUI JOIN
특정 범위 내의 결과값을 출력하기 위해 WHERE 절에 조인 조건에 연산자를 사용하거나
BETWEEN AND 연산자를 사용할 수 있다.

SELF JOIN
자신의 테이블만으로는 원하는 결과를 알아낼 수 없는 경우, 테이블이 두 개 존재하는 것처럼 자기 자신의 테이블과 조인하는 것을 SELF JOIN이라 한다. 이 경우 FROM 절에 같은 테이블 이름을 두 번 반복하게 되므로 반드시 테이블 별칭을 사용해야 한다.
select employee.ename || '의 매니저는' || manager.ename
from emp employee, emp manager
where employee.mgr=manager.empno;
질의 사항
where 절을 이해하지 못하겠음
employee테이블의 mgr컬럼(번호)과 manager의 empno컬럼(번호)이 동일한지 확인하고
왜 select manager.ename || '의 매니저는' || employee.ename 이렇게 하면 안되는 것인지

OUTER JOIN
외부 조인은 조인 조건에 만족하지 못하였더라도 해당 행을 나타내고 싶을 때 사용한다.
외부 조인은 "(+)" 연산자를 사용하여 NULL 값이기에 배제된 행을 결과에 포함시킬 수 있다.

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 8. 서브쿼리  (0) 2008.08.20
Chap 6. 그룹함수  (0) 2008.08.14
Chap 5. SQL 주요 함수  (0) 2008.08.13
2008. 8. 14. 17:24

Chap 6. 그룹함수

그룹함수는 전체 데이터를 그룹별로 구분하여 통계적인 결과를 구하기 위해서 사용된다.

count : 행의 개수를 카운트한다.
sum : 해당 열의 총 행의 합을 구한다.
avg : 해당 열의 총 행의 평균을 구한다.
min : 해당 열의 총 행 중 최소값을 구한다.
max : 해당 열의 총 행 중 최대값을 구한다.

group by 절
정의
select 컬럼명
from 테이블명
where 조건 (연산자)
group by 컬럼명;

having 절
group by절에 의해 생성된 결과 값 중 원하는 조건에 부합하는 자료를 보고자 할때

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 8. 서브쿼리  (0) 2008.08.20
Chap 7. 조인  (1) 2008.08.18
Chap 5. SQL 주요 함수  (0) 2008.08.13
2008. 8. 14. 15:15

Part 5. 자바에서 자주 사용되는 클래스 I Object 클래스

자바의 모든 클래스는 java.lang.Object 클래스로부터 상속을 받도록 설계되어 있다.

▶ Object 클래스의 생성자와 메서드

생성자

public Object()

중요 메서드

protected Object clone()

객체를 복사하는데 사용합니다.

public boolean equal(Object obj)

두 객체의 내용이 동일한지 알아볼 때 사용합니다.

public int hasCode()

자바에서 객체를 식별하는 정수 값인 해시 코드를 반환합니다.

protected void finalize()

객체를 더 이상 사용하지 않을 때 쓰레기 수집기능을 수행합니다.

public Class getClass()

객체의 클래스 이름을 Class 형으로 반환합니다.

public String toString()

객체의 문자열을 반환합니다.

public void notify()

대기 중인 스레드를 하나 다시 시작합니다.

public void notifyall()

대기 중인 모든 스레드를 다시 시작합니다.

public void wait()

스레드의 작동을 중지하고 대기 상태로 만듭니다.


=========================== toSTring() 메서드 사용 예====================
package pack01;
// Object 클래스의 상속을 받기에 Object의 메소드를 가져다 사용할 수 있다.
class Point2D{ // extends Object
}
public class Ex01 {
 public static void main(String[] args) {
  Point2D pt=new Point2D();
  System.out.println(pt); // 레퍼런스변수를 출력
  // getClass().getName() + '@' + Integer.toHexString(hashCode())
  System.out.println(pt.getClass());
  System.out.println(pt.getClass().getName());
  System.out.println(pt.hashCode());
  System.out.println(Integer.toHexString(pt.hashCode()));
 }
}
== toString() 메서드와 equals() 메서드를 동시에 사용하여 비교 하는 예 ==
package pack02;
class Example{
   private String name;
   private int id;
   public Example( ){ }
   public Example(String n, int i){
     this.name=n;
     this.id=i;
   }
   public String toString(){
    String tot="이름 :" + name +","+ "id :" + id;
    return tot;
   }
   public boolean equals(Object obj){
    boolean res=false;
    if(this==obj){
     res=true;
    }
    if(obj instanceof Example){
     Example ex=(Example)obj;
     if(this.name.equals(ex.name) && this.id==ex.id)
      res=true;
    }
    return res;
   }
}
class ex05_A02 {
   public static void main(String[] args) {
  Example ex01 = new Example("전원지", 1001);
  Example ex02 = new Example("전원지", 1001);
  /*Example ex01 = new Example("전원지", 1001);
     Example ex02 = new Example("전수빈", 1002);*/
  System.out.println(ex01);
  System.out.println(ex02);
   }   
}
===================================================================================
package pack02;
class Point{
 int x=10, y=20;
 public boolean equals(Object obj){
  boolean res=false;
  if(this == obj){// 자기가 자기 자신과 비교될 수 있다
   res=true;
  }
  // 오버라이딩이란 Object의 equals랑 동일해야 하기에
  // 전달인자가 Object 형이다. Object는 Point의 필드를 사용
  // 못하기에 다운 캐스팅해야 한다.
  // 다운 캐스팅은 형검사를 2번한다.
  // 1. 컴파일시 형검사는 캐스트 연산자 이용
  // 2. 런타임시 형검사(예외가 발생) - 막기 위해서는
  if(obj instanceof Point){
  Point test=(Point)obj;
  if(this.x==test.x && this.y==test.y)
   res=true;
  }
  return res;
 }
}
public class Ex04 {
 public static void main(String[] args) {
  Point pt01=new Point();
  Point pt02=new Point();
  System.out.println(pt01==pt02);
  // Object의 equals를 상속 받아 사용하고 있음
  // Object의 equals를 상속받지 않고 Point에서 오버라이딩
  System.out.println(pt01.equals(pt02));
  // 자료구조 : 해쉬테이블(검색을 용이하게 하기 위한)
  // 객체를 구분하기 위한 용도로 해쉬코드를 사용하므로 인해서 검색이 빨라
  System.out.println(pt01.hashCode());
  System.out.println(pt02.hashCode());
 }
}
===================================================================================

2008. 8. 13. 15:17

Chap 5. SQL 주요 함수

select 문은 from 절을 반드시 기술해야 하는데 기술할 해당 테이블이 없을 때 DUMMY 테이블인 DUAL을 사용한다.

ROUND(반올림) 함수
지정한 자리 수 이하에서 반올림한 결과 출력
select round(45.293, 2) : 소수점 2자리에서 반올림을 하여 값을 출력하라.
select round(45.293, -1) : 일의 자리에서 반올림을 하여 값을 출력하라.

TRUNC(버림) 함수
지정한 자리 수 이하를 버린 결과 출력
select trunc(45.293, 2) : 소수점 2자리에서 버린 값을 출력

MOD(나머지 구하는) 함수
나누기 연산을 한 후, 몫이 아닌 나머지를 결과로 되돌려주는 함수.

문자 처리 함수
upper : 대문자로 변경
select upper(컬럼명) from 테이블;
lower : 소문자로 변경
select lower(컬럼명) from 테이블;
initcap : 이니셜만 대문자로 변경
select initcap(컬럼명) from 테이블;
length : 문자열의 길이 출력
select length(컬럼명) from 테이블;
instr : 특정문자가 출현하는 위치 출력
select 컬럼명, instr(컬럼명, '찾는문자') from 테이블;
substr : 문자의 일부분을 추출
select 컬럼명, substr(컬럼명, 1, 2) : 첫문자에서 2글자 추출
select 컬럼명, substr(컬럼명, -3, 2) : 맨뒤 세번째문자에서 2글자 추출
sysdate : 시스템에 저장된 현재 날짜 출력

형변환 함수
to_number : 문자 데이터를 숫자 데이터로 변환
to_char : 숫자나 날짜 데이터를 문자 데이터로 변환
to_date : 문자 데이터를 날짜 데이터로 변환
select sysdate - to_date('2008/01/01', 'yyyy/mm/dd') from dual;
오늘 날짜에서 08년1월1일을 뺀 날이 몇일인가

null 변환 함수 nvl
select ename, sal, comm, sal*12+nvl(comm, 0) from emp;
comm 값이 null인 사람은 0으로 처리해서 출력하라

'수업 > 오라클 + PL/SQL' 카테고리의 다른 글

Chap3,4 SQLPLUS 명령어 & 연산자  (1) 2008.08.20
Chap 2. SQL의 기본  (2) 2008.08.20
Chap 8. 서브쿼리  (0) 2008.08.20
Chap 7. 조인  (1) 2008.08.18
Chap 6. 그룹함수  (0) 2008.08.14
2008. 8. 13. 14:32

Part 4. 상속 IV 인터페이스

여러가지 다양한 기능을 하는 하위 클래스를 설계하기 위해서 다중상속이 가능한 인터페이스가 필요하다.
인터페이스 내에는 상수 또는 추상메서드만 포함될 수 있다.
정의
접근_지정자 interface 인터페이스 이름{
상수;
접근_지정자 추상메서드();
}
인터페이스에 속한 모든 메서드는 추상메서드이므로 명시적으로 abstract 지시어를 붙이지 않아도 추상 메서드로 인식한다.
===================================================================================
package pack01;
// 추상 클래스 2개 
abstract class Hello{
 public abstract void sayHello();
}
abstract class Goodbye{
 public abstract void sayGoodbye();
}
// 서브 클래스 1개 : extends 다음에는 한개의 슈퍼클래스만 상속 가능
class SubTest extends Hello, Goodbye { // 컴파일 에러
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}*/
public class Ex01 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack02;
//추상 클래스 1개, 인터페이스 1개 
abstract class Hello{
 public abstract void sayHello();
}
interface Goodbye{
 void sayGoodbye();
}
// 서브 클래스 1개 : extends 다음에는 한개의 슈퍼클래스만 가능
class SubTest extends Hello implements Goodbye {
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}
public class Ex01 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack03;
// 인터페이스 2개
interface Hello{
 void sayHello();
}
interface Goodbye{
 void sayGoodbye();
}
// implements 다음에는 여러개의 인터페이스를 기술할 수 있다.
class SubTest implements Hello, Goodbye {
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}
public class Ex01 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack04;
interface Hello{
 void sayHello();
}
interface Goodbye extends Hello{
 void sayGoodbye();
}
class SubTest implements Goodbye{
 public void sayHello(){
 }
 public void sayGoodbye(){
 }
}
public class Ex01 {
 public static void main(String[] args) {
 }
}
=============================  도형의 넓이 계산  ==================================
package pack05;
interface IColor{
 int RED=1; // static final이 생략된
 int GREEN=2; // 이름이 있는 상수
 int BLUE=3;
}
// 동일한 접근방식을 위한 표준안을 제공하기 위해서
abstract class Shape{
 double area; // 추상클래스에 면적을 저장할 변수 선언
 abstract void Calc();
 void prn(){ // 일반 메소드도 정의
  System.out.println(area);
 }
}
// 면적만 구하는 원에서 색상도 있는 원으로 업그레이드
class Circ extends Shape implements IColor{
 int color;
 Circ(){
  color=RED;
 }
 int r=5;
 void Calc(){
  area=r*r*Math.PI;
 }
}
class Rect extends Shape{
 int w=10, h=10;
 void Calc(){
  area=w*h;
 }
}
public class Ex01 {
 public static void poly(Shape ref){ // 업캐스팅 후에는
  // 반지름이 5인 원의 면적
  // 다운캐스팅은 2번 형 검사를 한다.
  // 1. 컴파일시의 발생하는 형검사는 캐스트 연산자로 가능
  // 2. 런타임시 발생하는 형검사는 instanceof 연산자로
  if(ref instanceof Circ){
   Circ c=(Circ)ref;
   System.out.println("반지름이 "+c.r+" 인 원의 면적");
  }
  else if(ref instanceof Rect){
   Rect r=(Rect)ref;
   System.out.println("너비가 "+r.w+" 높이가"+r.h+" 인 사각형의 면적");
  }
  /*Circ c=(Circ)ref;
  System.out.println("반지름이 "+c.r+" 인 원의 면적");*/
  ref.Calc(); // 오버라이딩한 함수를 호출하면 인스턴스에
  ref.prn(); // 의해서 호출될 함수가 결정된다.
 }
 public static void main(String[] args) {
  poly(new Circ());
  poly(new Rect());
  /*Circ c=new Circ();
  c.Calc();
  c.prn();
  Rect r=new Rect();
  r.Calc();
  r.prn();*/
 }
}
===================================================================================
2008. 8. 13. 13:58

Part 4. 상속 III 추상 클래스와 Final

추상 클래스는 동일한 메서드로 접근 가능한 서브 클래스들을 설계하도록 하기 위해서이다.

추상 클래스는 객체를 생성할 수 없다.
정의
abstract class 클래스명 {
  abstract void 메서드명();
}
추상 메서드를 하나라도 가지면 추상 클래스로 설계해야 한다.
추상 메서드는 추상 클래스의 상속을 받는 서브 클래스에서 어떻게 동작할지 반드시 구현 되어야 한다.
===================================================================================
package training;
// 추상클래스 : 한개 이상의 추상메소드를 갖는 객체 생성을 못함
abstract class AbstractClass {
// 몸체가 없는 메소드 : 추상 메소드
 abstract void Method01();
}
// 서브클래스 : 슈퍼클래스로 추상클래스가 사용됨
// 추상 클래스를 슈퍼클래스로 갖는 서브클래스에서는
// 추상메소드를 오버라이딩 해야 한다는 강제성을 부여 받게 된다.
class SubClass extends AbstractClass{
 void Method01(){
  System.out.println("Method01");
 }
}
public class Ex01 {
 public static void main(String[] args) {
  AbstractClass ac=null; // 레퍼런스 변수 선언은 가능
  // ac=new AbstractClass(); // 객체 생성을 못함
  ac=new SubClass(); // 업캐스팅
  ac.Method01(); // 업캐스팅 후에는 서브클래스에서 오버라이딩된 메소드가 호출 됨
 }
}
===================================================================================
// 추상 클래스를 이용한 다형성 : 구체적인 동작은 다르더라도 접근방식은 동일하게
package training;
abstract class Shape{
 public abstract void draw(); // 동일해야하는 접근 방식을 추상메소드로
}
class Circ extends Shape{
 public void draw(){
  System.out.println("원을 그리다");
 }
}
class Rect extends Shape{
 public void draw(){
  System.out.println("사각형을 그리다");
 }
}
class Tri extends Shape{
 public void draw(){
  System.out.println("삼각형을 그리다");
 }
}
public class Ex02 {
 public static void poly(Shape s){
  s.draw();
  // 3 객체 모두에 적용될 공통적인 로직을 기술한다. (길면 길수록 유용)
 }
 public static void main(String[] args) {
  poly(new Circ());
  poly(new Rect());
  poly(new Tri());
  /*Shape s=null; // 객체는 생성하지 못하더라도 레퍼런스 변수 선언은 가능하다.
  s=new Circ();
  s.draw();
  s=new Rect();
  s.draw();
  s=new Tri()
  s.draw();*/
 }
}
===================================================================================
final
사용 범위 : 변수, 메서드, 클래스
final 변수 : 변수를 상수화 시켜서 저장된 값이 변하지 않는다.
final 메서드 : 서브클래스에서 오버라이딩을 허용하지 않는다.
final 클래스 : 상속이 허용되지 않는다.

===================================================================================
package training;
class FinalTest{
 final int A=10; // 이름이 있는 상수
 // int a=10; // a는 변수
 final public int getA(){
  return A;
 }
}
final class SubTest extends FinalTest{
 // FinalTest 클래스의 final getA() 메소드는 오버라이딩이 불가능
 /*public int getA(){
  return A;
 }*/
}
/*class SubEx extends Subtest{ // final SubTest는 서브클래스를 만들 수 없다.
 
}*/
public class Ex04 {
 
 public static void main(String[] args) {
  FinalTest ft=new FinalTest();
  // ft.a=20; // final로 선언된 변수는 상수화되어 값을 변경할 수 없기에 대입연산자 왼쪽에 못옴
  // 10=20; // 상수는 값이 변할수 없기에 대입연산자 왼쪽에 못옴
  System.out.println(ft.A);
 }
}
===================================================================================

2008. 8. 11. 17:37

Part 4. 상속 II 생성자, 레퍼런스 형변환

상속에서의 생성자의 특징
1. 생성자는 상속되지 않는 유일한 멤버함수이다.
2. 자동 호출되는 생성자는 전달인자 없는 디폴트 생성자 형태이다.
3. 슈퍼 클래스 생성자가 먼저 실행되고 서브 클래스의 생성자가 실행된다.

===================================================================================
package training;
class Point2D {
 int x, y;
 public Point2D(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }
 public Point2D(){
  System.out.println("Point2D의 전달인자가 없는 생성자 ");
 }
 public void prn(){
  System.out.println(x + "," + y );
 }
}
class Point3D extends Point2D {                
 int z;
 public Point3D(int x, int y, int z) {
  super(x, y);
  this.z = z;
 }
 public Point3D(){
  System.out.println("Point3D의 전달인자가 없는 생성자 ");
 }
 public void prn(){
  System.out.println(x + "," + y + "," + z);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  Point2D p2d=new Point2D(10,20);
  p2d.prn();
  Point3D p3d=new Point3D(10,20,30);
  p3d.prn();
  new Point3D();
 }
}
// 디폴트생성자
// 1. 전달인자가 없는 형태
// 2. 프로그래머가 전달인자 있는 생성자를 만들어 주면 더 이상 제공해 주지 않는다.
// 3. 상속관계에서는 서브클래스의 생성자가 슈퍼클래스의 디폴트 생성자를 자동 호출하고 있다.
// 해결방법
// 1. 슈퍼클래스에 전달인자 없는 생성자를 만든다.
// 2. 서브클래스에 생성자를 만들어서 슈퍼클래스의 생성자를 명시적으로 호출
===================================================================================
레퍼런스 변수들 사이의 형변환은 상속관계에서만 가능하다.
상속관계에 있는 클래스 사이의 형변환은 업캐스팅과 다운캐스팅이 있다.
업캐스팅 : 서브 클래스의 레퍼런스 값이 슈퍼 클래스의 레퍼런스 변수에 저장되면서
슈퍼 클래스 형으로 변환 되는것
업캐스팅은 암시적이 형변환이 이루어진다.
참조 가능한 영역이 축소 된다.
다운캐스팅 : 서브클래스로 형변환하는 것. 참조 가능한 영역이 확대되는 것을 의미하며
명시적 형변환이 필요하다.
===================================================================================
package training;
class Parent{
 public void parentPrn(){
  System.out.println("Parent 클래스의 parentPrn() 메소드");
 }
}
class Child extends Parent{
 // 오버라이딩
 public void parentPrn(){
  System.out.println("Child 클래스의 parentPrn() 메소드 오버라이드 ");
 }
 public void childPrn(){
  System.out.println("Child 클래스의 childPrn() 메소드");
 }
}
public class Ex02 {
 public static void main(String[] args) {
  Parent p=new Child(); // 업캐스팅
  p.parentPrn(); // 부모로부터 상속받은 것만 접근 가능
  // Child 객체는 자신의 메소드도 호출 되어야만 한다.
  // p.childPrn(); // 불가능
  Child c=(Child)p; // 다운캐스팅 : 명시적으로 캐스팅 해 줘야 함.
  c.childPrn();
 }
}
// 상속 관계에 있으므로 Child는 Parent의 멤버를 가져다 사용할 수 있음
//Child c=new Child();
//c.parentPrn(); // 부모로부터 상속 받은 것
//c.childPrn(); // 자신의 것
// 형변환 : 대입연산자를 기준으로 왼쪽, 오른쪽에 오는 피연산자의 자료형이 다를 경우
//Parent p=c; // 업캐스팅 : 자동
//p.parentPrn(); // 부모로부터 상속받은 메소드만 호출 가능
// p.childPrn(); // 업캐스팅 후에는 자신의 메소드 호출 불가능
===================================================================================
package pack01;
class Point2D {
 int x, y;
 public void prn(){
  System.out.println(x + "," + y );
 }
}
class Point3D extends Point2D {
 int z;
 public void prn(){
  System.out.println(x + "," + y + "," + z);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  Point2D p2d=new Point3D();
  p2d.prn();
  Point3D p3d=(Point3D)p2d;
  System.out.println("," + p3d.z);
 }
}
===================================================================================

질의 사항
실제로 업캐스팅과 다운캐스팅이 필요한 때가 언제인지.

'수업 > 자바2JDK입문' 카테고리의 다른 글

Part 4. 상속 IV 인터페이스  (1) 2008.08.13
Part 4. 상속 III 추상 클래스와 Final  (0) 2008.08.13
상속을 이용한 클래스 설계 및 출력  (0) 2008.08.08
Part 4. 상속 I  (0) 2008.08.08
Part 3. static  (2) 2008.08.07
2008. 8. 8. 17:59

상속을 이용한 클래스 설계 및 출력

간단한 문제를 통해서 상속에 대해서 알아봅시다.

동물(Animal)과 개(Dog)와 사람(Human)이란 클래스를 서로 상속이란 개념을 도입해서 설계해 보도록 합시다.
슈퍼 클래스로는 동물(Animal)을 두고,
슈퍼 클래스에는 멤버변수로는 어떤 종인지의 구분을 위해서 kind와 다리의 개수를 저장하기 위한 leg를 둡니다.
또한 슈퍼 클래스의 멤버함수로는 getKind와 walk를 둡니다.
getKind 메서드는 어떤 동물인지를 알려주는 메서드이고 walk 메서드로 어떻게 걷는지를 알려주는 메서드입니다.
슈퍼 클래스 상속 관계로 개(Dog)와 사람(Human) 클래스를 설계해봅시다.
kind와

Animal

#kind : String

#leg : int

+Animal( )

+Animal(kind : String, leg : int)

+getKind( )

+walk( )

Dog

+bike( )

Human

+speak( )

1. ====================== Animal ====================================
package j4b1s;
public class Animal {
 protected String kind;
 protected int leg;
 public Animal() {
  super();
 }
 public Animal(String kind, int leg) {
  super();
  this.kind = kind;
  this.leg = leg;
 }
 public String getKind() {
  return kind;
 }
 public void setKind(String kind) {
  this.kind = kind;
 }
 public int getLeg() {
  return leg;
 }
 public void setLeg(int leg) {
  this.leg = leg;
 }
 public void walk(){
 }
}
===============================================================================
2. ====================== Human ====================================
package j4b1s;
public class Human extends Animal{
 public void speak(){
  System.out.print("Java개발자 이강국입니다.");
 }
}
===============================================================================
3. ====================== Dog ====================================
package j4b1s;
public class Dog extends Animal{
 public void bike(){
  System.out.println("멍멍하고 짖습니다.");
 }
}
===============================================================================
4. ====================== AnimalMain ====================================
package j4b1s;
public class AnimalMain {
 public static void main(String[] args) {
  Human human=new Animal();
  Dog dog=new Animal();
  Human speak=new Human();
  Dog bike=new Dog();
  human.kind="한국사람";
  human.leg=2;
  Human.speak();
  dog.kind="진돗개";
  dog.leg=4;
  Dog.bike();
  //System.out.println(human.getKind() + "은 다리가 "+ human.leg() + "개 이고 "+human.walk());
 }
}
===============================================================================

'수업 > 자바2JDK입문' 카테고리의 다른 글

Part 4. 상속 III 추상 클래스와 Final  (0) 2008.08.13
Part 4. 상속 II 생성자, 레퍼런스 형변환  (2) 2008.08.11
Part 4. 상속 I  (0) 2008.08.08
Part 3. static  (2) 2008.08.07
Part 3. 생성자  (0) 2008.08.07
2008. 8. 8. 15:30

Part 4. 상속 I

상속은 코드의 재활용에 유용하며, 자식 클래스(서브클래스)는 부모 클래스(슈퍼클래스)로부터 파생된 객체로서 부모 클래스가 가지고 있는 모든 속성들을 상속받아 사용할 수 있다.

정의 형식
class Animal {   // 부모 클래스
}
class Cat extends Animals {
}

접근지정자의 종류와 성격

접근 지정자

자신의 클래스

같은 패키지

하위 클래스

다른 패키지

private

O

X

X

X

생략(기본 접근 지정자)

O

O

X

X

protected

O

O

O

X

public

O

O

O

O


메서드 오버라이딩이란
서브클래스에서 슈퍼클래스와 동일한 이름의 메서드를 새롭게 정의해서 슈퍼클래스의 메서드를 더 이상 사용하지 않고(은닉하고) 서브클래스에서 새롭게 정의한 메서드를 사용하는 것

메서드 오버라이딩을 할때는 슈퍼클래스 메서드의 이름, 전달인자의 자료형과 전달인자의 개수를 동일하게 정의해야 한다.

은닉된 슈퍼클래스의 메서드의 기능을 불러오기 위해서는 레퍼런스 변수 super를 사용해서 처리한다. super.메서드();

========================== 다른 패키지의 클래스를 호출하는 형식 ===================
package training;
import ex.phone.Mp3;                           // ex.phone 패키지의 Mp3 클래스를 호출
public class Ex07 {
 public static void main(String[] args) {
  Mp3 mp=new Mp3("ever", 256);
  mp.print();
 }
}
=================================================================================

========================== 상속 및 메소드 오버라이딩 ===================
package training;
class MyPoint2D {
 int x=10;
 int y=20;
 // JVM 디폴트 생성자를 제공 : 전달인자 없는 형태
 // 프로그래머가 전달인자 없는 생성자를 만들어주면 없어진다.
 public MyPoint2D(int x, int y){
  System.out.println("MyPoint2D");
 }
 public MyPoint2D(){
 
 }
}
class MyPoint3D extends MyPoint2D { // 슈퍼클래스의 전달인자 없는 생성자 호출
 int x=40;
 int y=50;
 int z=30;
 void show(){
  System.out.println(this.x+","+this.y+","+z);
 }
 void supershow(){
  System.out.println(super.x+","+super.y+","+z);
  //System.out.println(super.x+","+super.y+","+super.z); // z는 부모에 없는 필드
 }
}
public class Ex12 {
 public static void main(String[] args) {
  MyPoint3D pt=new MyPoint3D();
  pt.show();
  pt.supershow();
 }
}
=================================================================================

========================== 접근 지정자 사용예 ===================
package training;
class Point2D{
 // 서브 클래스에서 멤버를 접근허용하기 위한 접근 지정자는 protected
 //  기본(디폴트) 접근지정자
 int x;
 int y;
 //private int x;
 //private int y;
 public int getX() {
  return x;
 }
 public void setX(int x) {
  this.x = x;
 }
 public int getY() {
  return y;
 }
 public void setY(int y) {
  this.y = y;
 }
}
class Point3D extends Point2D{
 private int z;

 public int getZ() {
  return z;
 }

 public void setZ(int z) {
  this.z = z;
 }
 public void show(){
  System.out.println(x + "," + y + "," + z);
 }
}
public class Ex10 {
 public static void main(String[] args) {
  // Point3D pt=new Point3D(1,2,3);
  Point3D pt=new Point3D(); //
  pt.setX(10);
  pt.setY(20);
  pt.setZ(30);
  // System.out.println( pt.getX() +" : pt.getX() , " + pt.getY() + " : pt.getY() ," + pt.getZ() + " : pt.getZ()");
  System.out.println( pt.x +" : pt.getX() , " + pt.getY() + " : pt.getY() ," + pt.getZ() + " : pt.getZ()");
 }
}
=================================================================================

'수업 > 자바2JDK입문' 카테고리의 다른 글

Part 4. 상속 II 생성자, 레퍼런스 형변환  (2) 2008.08.11
상속을 이용한 클래스 설계 및 출력  (0) 2008.08.08
Part 3. static  (2) 2008.08.07
Part 3. 생성자  (0) 2008.08.07
Part 2 & 3 메소드와 클래스  (0) 2008.08.06
2008. 8. 7. 14:39

Part 3. static

1. 정적 멤버변수
class staticTest {
  static int a=10; // 정적 멤버변수(클래스 단위 멤버변수)
  int b=20;         // 
}
static으로 선언한 멤버는 램 상에 힙 영역이 아닌 메모리에 기억공간이 할당되며 메모리 영역에 할당된 static 멤버변수는 몇 개의 객체를 생성하던지 상관없이 프로그램이 끝날 동안 클래스 단위당 한번만 메모리 할당을 합니다.

2. 정적 메소드
static 속성이  private로 선언되어 있다면 정적 멤버변수를 사용하기 위한 메서드 정의가 필요합니다.
이런 메소드는 인스턴스 차원이 아닌 클래스 차원에서 사용 가능하도록 설계해야 합니다.
이건 곧 인스턴스의 생성 없이 클래스명으로 호출이 가능하다는 의미와 같습니다.
정적 메소드 사용시 유의사항
1. this 레퍼런스를 사용할 수 없다.
2. 인스턴스 변수를 사용할 수 없다.
3. 오버라이딩 되지 않는다.

package training;
class staticTest{
 // 멤버는 2가지로 나뉨 : 클래스 단위로 동작/인스턴스 단위로 동작
 // static int a=10;
 private static int a=10; // 클래스(static 추가) 단위로 동작
 // 필드 a에 대해서 segger/getter : 클래스명으로 접근하는 정적 메소드
 // 정적 메소드는 setter/getter에 static만 붙여주면 된다.
 public static int getA() {
  return a;
 }
 public static void setA(int a) {
  staticTest.a = a; // 정적 메소드는 this를 쓸 수 없다.
 }
 // int b=20;
 private int b=20; // 인스턴스 단위로 동작
 public int getB() { // 인스턴스 메서드는
  return b;       // 레퍼런스 변수로 접근해야 한다.
 }
 public void setB(int b) {
  this.b = b;
 }
}
public class Ex04 {
 public static void main(String[] args) {
  // 클래스에 대한 정보로 메모리에 올라가면서 이때
  // static 멤버도 함께 메모리 할당하고 끝나서 a는 한개만 존재
  // System.out.println(staticTest.a); // 클래스명으로 a의 소속을 밝힌다.
  System.out.println(staticTest.getA());
  staticTest s1=new staticTest();
  staticTest s2=new staticTest();
  staticTest s3=new staticTest();
  staticTest s4=new staticTest();
  // 인스턴스 필드는 인스턴스 개수만큼 존재
  // 인스턴스 필드는 반드시 레퍼런스 변수로 접근해야 한다.(클래스명은 접근불가)
  // System.out.println(s1.b);
  System.out.println(s1.getB());
  // 정적필드는 클래스명 뿐만 아니라, 레퍼런스 변수로도 접근 가능
  System.out.println(s1.getA());
  s1.setA(100); s1.setB(200);
  System.out.println(s1.getA() + ":" + s1.getB());
  System.out.println(s2.getA() + ":" + s2.getB());
 }
}