본문 바로가기

자바

[자바기초요약4] 패키지 , 상속

# 패키지
[ex]
소스파일 저장장소 : ~/pkg/src
실행파일 생성장소 : ~/pkg/bin

A.java
======
package a.b;
class A{
 public static void main(String args[]){
  System.out.println(100);
 }
}


[컴파일]javac   -d    패키지가생성될곳의경로    xxx.java
 javac   -d    ~/pkg/bin    ~/pkg/src/A.java
[실행] java   패키지명
 java   a.b.A

-----------------------------------------------------------------
[ex] classpath환경변수 설정하기
리눅스에서
 export CLASSPATH=값:값:값:...
 export CLASSPATH=.:/pkg/bin:값:값:...

 echo $CLASSPATH
윈도우에서
 set classpath=값;값;값; ...
 set classpath=c:/pkg/bin

 set classpath
 
 
[ex] 소스파일 저장장소 : ~/pkg/pkg1/src/A.java
       실행파일 생성장소 : ~/pkg/pkg1/bin 
package com.naver;
public class A{
 public int a=100;
}

 
 소스파일 저장장소 : ~/pkg/pkg2/src/B.java
 실행파일 생성장소 : ~/pkg/pkg2/bin 
package com.daum;
import com.naver.A;                           
class B{
 public static void main(String args[]){
  A o=new A();
  System.out.println(o.a);
 }
}


export  CLASSPATH=.:~/pkg/pkg1/bin:~/pkg/pkg2/bin
 // 현재폴더 : 패키지1 실행파일이담긴폴더 : 패키지2 실행파일이담긴폴더  
 //   3개를 환경변수에 추가해줌
 javac  -d   ~/pkg/pkg2/bin  ~/pkg/pkg2/src/B.java
 // 환경변수에추가안해주면 그 패키지가 담긴곳에가야 실행되지만 

 java  com.daum.B
 // 지금 예제처럼 소스내용이 import로 데리고왔기때문에 경로가 두군임                                                                                            
// 그래서 환경변수로 두경로를 꼭 추가해주어야함 
set classpath=.;c:/pkg/pkg1/bin;c:/pkg/pkg2/bin
 javac  -d   c:/pkg/pkg2/bin  c:/pkg/pkg2/src/B.java
 java  com.daum.B

 
 
 
[EX]
< pkg1/src => A.java >
package com.naver;

public class A{
public int a=100;
}
< pkg2/src => B.java >
package com.daum;
public class B{
public int a=200;
}

< pkg2/src => C.java >
package kr.co.seoulit;
import com.naver.A;
import com.daum.B;
class C{
public static void main(String args[]){
A o1=new A();
B o2=new B();
System.out.println(o1.a);
System.out.println(o2.a);
}
}

1. A.java와 B.java를 컴파일한다( import...다른클래스를 참조하는것이없어서 바로가능 )
2. C.java를 컴파일해주기위해선 다른패키지를 가져와야되기때문에 컴파일이 바로안됨 
                => 환경변수로 A와 B의 빈파일(컴파일후생성된파일위치)를 추가해준다.
3.C.java를 컴파일한다 
 
 
 
 
 
 

# 접근제어자
public(모두접근허용) > protected(같은패키지면접근허용,다른패키지일때 상속이면 접근허용)
> default(같은패키지면접근허용) > private(접근금지)

[ex]
A.java
======
package a.b;
class A{
 public int a;
 protected int b;
 int c;
 private int d;
}

B.java( 같은패키지일경우 private를 제외한 다 접근가능 )
=======
package a.b; 
class B{
 void m(){
  A o=new A();
  System.out.println(o.a);
  System.out.println(o.b);
  System.out.println(o.c);
  System.out.println(o.d); // 컴파일에러(실행에러아니고 그냥 바로 컴파일에러)
 }
}


[ex]
A.java
======
package a.b;
public class A{
 public int a;
 protected int b;
 int c;
 private int d;
}

B.java( 다른패키지일경우 public만 접근가능 )
=======
package c.d;
import a.b.A;
class B{
 void m(){
  A o=new A();
  System.out.println(o.a);
  System.out.println(o.b); // 컴파일에러
  System.out.println(o.c); // 컴파일에러
  System.out.println(o.d); // 컴파일에러
 }
}

 
[ex]
A.java
======
package a.b;
public class A{
 public int a;
 protected int b;
 int c;
 private int d;
}

B.java ( 다른 패키지이지만 상속하였으므로 protected는 접근가능!! )
=======
package c.d;
import a.b.A;
class B extends A{
 void m(){
  System.out.println(a);
  System.out.println(b); // 단 A라는 객체주소값을통해서는 안됨!! ( 즉, new A().b 는 안됨 )
  System.out.println(c); // 컴파일에러
  System.out.println(d); // 컴파일에러
 }
}

 
 
 
 
 
 
# 상속

[ex]
class A{
 int a=100;
 void m1(){
  System.out.println(200);
 }
 void m2(){
  System.out.println(300);
 }
}

class B extends A{
 }

class C{
 public static void main(String args[]){
  B o=new B();
  System.out.println(o.a);
  o.m1();
  o.m2();
 }
}

 
[ex]

class A{
 int a=100;
 void m1(){
  System.out.println(200);
 }
 void m2(){
  System.out.println(300);
 }
}
class B extends A{
 void m3(){
  System.out.println(400);
 }
}
class C{
 public static void main(String args[]){
  A o=new A();
  System.out.println(o.a);
  o.m1();
  o.m2();
  o.m3();       // 이부분 에러  ...  클래스A를 가리키는데 B까지 담을수없음..
                // 만약 클래스B를가리키면 그부모A 까지 담을수있음
 }
}

 
[ex]
class A{
 String m(){
  return "abc";
 }
}
class C{
 public static void main(String args[]){
  A o=new A();
  String s=o.m();
  System.out.println(s);
 }
}

[ex]
class A{
 int a=100;
}
class B extends A{
 int b=200;
}
class C extends B{
 int c=300;
}
class D{
 public static void main(String args[]){
  C o=new C();
  System.out.println(o.a);
  System.out.println(o.b);
  System.out.println(o.c);
 }
}


# 오버라이딩  
[ex]
class A{
 void m(){
  System.out.println(1);
 }
}
class B extends A{
 void m(){
  System.out.println(2);
 }
}
class D{
 public static void main(String args[]){
  B o=new B();
  o.m();
 }
}


# this와 super
[ex]
class A{
 int a=100;     // B입장에서 은닉변수
 void m(){      // B입장에서 은닉메서드
  System.out.println(1);
 }
}
class B extends A{
 int a=200;
 void m(){
  System.out.println(this.a);             //(a)는 원래 (this.a)라고함... ( 즉, 기본 a만해도 this. 가 생략되어있음 )
  System.out.println(super.a);            //super는 은닉변수나 은닉메서드를 부를때 사용
 }                                        //class A의 변수 a와 메서드 m()은 은닉변수,은닉메서드임
}
class D{
 public static void main(String args[]){
  B o=new B();
  o.m();

 }
}

[an] 200
       100
 
 
 
 
 
 
 
 
1. toString()

Object클래스의 toString()이란 ① 객체의 정보를 리턴하는 기능을 가지고 있는 메서드
특징 ① 참조형 변수 일 때만 System.out.println(o); 했을 때
System.out.println(o. toString()); 생략되어있음
② 객체의 정보를 return할 때,
멤버변수 모두 return하는 게 좋다
 
 
 
1) 참조형 변수
(1) 클래스
(2) 배열
(3) 인터페이스
=======================================================================================================
[ex]
class A{
 String m(){
  return "aaa";
 }

}
class B{
 public static void main(String args[]){
  A o=new A();
  System.out.println(o.m());                     //aaa

  System.out.println(o.toString());             //A@ds2w
  System.out.println(o);                        //A@ds2w      즉,참조형변수뒤에 .toString()가
                                                // 생략되어있음 ... 두개다 똑같은말임
 }
}

 
 
ex)
class Test{
public static void main(String[] args){
A o=new A();
System.out.println(o.toString()); //toString() 생략되어있음
}
}

 
 
[ex]
/*                          //이 주석안의3줄은 기본적으로 적용되는것임.. 우리가 따로적어주지않아도 항상
package java.lang;          //저부분이 실행된다고 보면됨
public class Object{
 public String toString(){
 }
}
*/
class Car{
 String color;
 public String toString(){
  return color+" car";
 }
}
class B{
 public static void main(String args[]){
  Car car=new Car();
  car.color="yellow";
  String s=car.toString();
  System.out.println(s); // yellow car
 }
}

 

[ex]
/*
package java.lang;
public class Object{
 public String toString(){
 }
}
*/
class Car{
 String color;
 public String toString(){
  return color+" car";
 }
}
class B{
 public static void main(String args[]){
  Car car=new Car();
  car.color="yellow";
  System.out.println(car);             //당연히 car는 car의주소값을 가지고있다.
                                       //하지만 참조형변수(car)뒤에 .toString() 이 생략되어있음
  Car car2=new Car();                  //그래서 System.out.println(car.toString()); 이렇게 실행됨
  car2.color="green";
  System.out.println(car2);
 }
}