패키지를 import하는 법
import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;
IntelliJ에서 MAC 기준으로 자동 import 단축키는 option+Enter
이 때, 다음의 두 코드는 서로 의미가 다르다.
import java.util.*; //java.util 패키지의 모든 클래스
import java.text.*;
import java.*; //java패키지의 모든 클래스
이 때 아래의 코드는 java패키지의 모든 클래스를 의미하는데 패키지는 포함되지 않는다.
Static멤버를 사용할 때는 클래스 이름을 생략할 수 있다.
import static java.lang.Integer.*; //Integer클래스의 모든 static 메서드
import static java.lang.Math.random;
import static java.lang.System.out;//System.out을 out만으로 참조가능
이 때
System.out.println(Math.random());
을
out.println(random())
으로 생략하여 사용할 수 있다.
import static java.lang.Integer.*;
import static java.lang.Math.*;
import static java.lang.System.out;
public class Ex {
public static void main(String[] args) {
out.println(random());
out.println("Math.PI:" + PI);
}
}
package packTest;
class A {
}
package packTest;
public class B {
A a;
}
A,B클래스는 같은 패키지이므로, A클래스에 접근 가능하다.
package packTest2;
import packTest.*;
public class C {
A a; //디폴트 접근제한이라 컴파일 에러
B b; //public은 가능
}
C클래스는 A,B와 다른 패키지이다.
이 때 default 접근제한을 갖는 A클래스에는 접근이 되지 않지만, public 접근 제한을 갖는 B클래스에는 접근이 가능하다.
생성자도 클래스의 접근 제한과 동일하다.
package packTest;
public class A{
A a1 = new A(true);
A a2 = new A(1);
A a3 = new A("문자열");
public A(boolean b){} //public
A(int b){}
private A(String s){}
}
package packTest;
public class B {
A a1 = new A(true);
A a2 = new A(1);
// A a3 = new A("문자열");
}
클래스 A,B는 패키지가 동일하므로 A클래스의 private 생성자를 제외하고는 모두 호출할 수 있다.
package packTest2;
import packTest.*;
public class C {
A a1 = new A(true);
// A a2 = new A(1);
// A a3 = new A("문자열");
}
패키지가 다른 C클래스에서는 public생성자를 제외하고 다른 생성자를 호출할 수 없다.
package packTest;
public class A {
public int field1;
int field2;
private int field3;
//클래스 내부일 경우 접근 제어자의 영향X
public A() {
field1 = 1;
field2 = 1;
field3 = 1;
method1();
method2();
method3();
}
public void method1() {
}
void method2() {
}
private void method3() {
}
}
package packTest;
public class B {
public B(){
A a = new A();
a.field1 = 1;
a.field2 = 1;
// a.field3 = 1; //private필드 접근 불가
a.method1();
a.method2();
// a.method3(); #private메소드 접근 불가
}
}
패키지가 동일한 B클래스에서는 A클래스의 private를 제외한 필드와 메소드는 사용할 수 있다.
package packTest2;
import packTest.*;
public class C {
public c(){
A a = new A();
a.field1 = 1;
// a.field2 = 1; //default
// a.field3 = 1; //private
a.method1();
// a.method2();
// a.method3();
}
}
패키지가 다른 C클래스에서 A클래스의 public을 제외한 필드,메소드는 사용할 수 없다.
pack1 패키지에 protecte로 선언된 필드, 생성자, 메서드가 있다.
package pack1;
public class A {
protected String field;
protected A() {
}
protected void method() {
}
}
또 동일한 패키지의 클래스 B가 있다. 이 때에는 A 클래스에 얼마든지 접근 가능하다.
package pack1;
public class B {
public void method(){
A a = new A();
a.field = "value";
a.method();
}
}
그런데 만약 다른 패키지에 있다면? 접근 불가능하다.
package pack2;
import pack1.A;
public class C {
A a = new A();
a.field = "value";
a.method();
}
그런데 자식 클래스를 만들어서 자식 생성자에서 super()로 A생성자를 호출한다면 접근 가능하다.
package pack2;
import pack1.A;
public class D extends A {
public D(){
super();
this.field = "value";
this.method();
}
}
메소드 이름은 get/set + 필드이름(첫문자 대문자)형식으로 지정한다.
package packTest;
public class Car {
private int speed;
private boolean stop;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
if (speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
public boolean isStop() { //필드타입이 boolean이면 get이 아닌 is로 시작하는 것이 관례이다.
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
this.speed = 0;
}
}
package packTest;
public class CarExample {
public static void main(String[] args) {
Car car = new Car();
car.setSpeed(-50);
System.out.println("현재 속도: " + car.getSpeed());
car.setSpeed(50);
if (!car.isStop()) {
car.setStop(true);
}
System.out.println("현재 속도: " + car.getSpeed());
}
}
package packTest;
public class Time {
private int hour;
private int min;
private int sec;
//외부에서 접근하지 못하게
public int getHour() {
return hour;
}
public void setHour(int hour) {
if (hour < 0 || hour > 23)
return;
this.hour = hour;
}
public int getMin() {
return min;
}
public void setMin(int min) {
if (min < 0 || min > 59)
return;
this.min = min;
}
public int getSec() {
return sec;
}
public void setSec(int sec) {
if (sec < 0 || sec > 59)
return;
this.sec = sec;
}
}
class Person{
private int weight;
int age;
protected int height;
public String name;
public void setWeight(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
}
class Student extends Person{
public void set(){
age = 30;
name = "홍길동";
height = 175;
// weight = 99;
setWeight(99);
}
}
public class InheritanceEx {
public static void main(String[] args) {
Student s = new Student();
s.set();
System.out.println("나이="+s.age);
System.out.println("이름="+s.name);
System.out.println("키="+s.height);
System.out.println("몸무게="+s.getWeight());
}
}