# 패키지
[ex]
소스파일 저장장소 : ~/pkg/src
실행파일 생성장소 : ~/pkg/bin
======
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
[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
// 환경변수에추가안해주면 그 패키지가 담긴곳에가야 실행되지만
// 지금 예제처럼 소스내용이 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(접근금지)
======
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); // 컴파일에러(실행에러아니고 그냥 바로 컴파일에러)
}
}
======
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); // 컴파일에러
}
}
======
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();
}
}
[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);
}
}