본문으로 바로가기

멤버에 대한 접근 제한


private 멤버 만들기


class Car

{

private int num;

private double gas;

}

멤버에 private이라는 제한자를 붙였다. 이렇게 되면 Car 클래스 외부(main ()메소드에서 ) 필드에 접근할 수 없다.


class Sample1

{

public static void main [String[] args]

. . .
// 접근 불가능    클래스 외부에서 private 멤버에 접근 할 수 없다.

// car1.num = 1234;

// car1.gas = -10.0;

}


Public 멤버 만들기


멤버에 대한 접근을 제한


class Car

{

private int num;   외부에서 접근 불가능

private double gas;

Public void setNumGas(int n, double g)  외부에서 접근 가능, public제한자

{

if( g > 0 && g < 1000)

{

num =  n;

gas = g;

System.out.println("차량 번호를"+ num + "으로, 연료량을 "+ gas +" 바꾸었습니다.");

}

else

{

System.out.println(g + "는 올바른 연료 양이 아닙니다.");

System.out.println("연료 양을 바꿀 수 없습니다.");

}

}

public void show() 외부에서 접근 가능하며 public 제한자

{

System.out.println("차량 번호는" + num + "입니다.");

System.out.println("연료 양는" + gas+"입니다.");

}

}


public class Sample1 {


public static void main(String[] args) {

// TODO Auto-generated method stub

Car car1 = new Car();

// 접근 불가능

//car1.num = 1234;

//car1.gas = -10.0;

car1.setNumGas(1234, 20.5);

car1.show();

System.out.println("잘못된 연료양(-10.0)을 저장하겠습니다.");

car1.setNumGas(1234, -10.0);

car1.show();

}


}

실행결과

차량 번호를1234으로, 연료량을 20.5 바꾸었습니다.

차량 번호는1234입니다.

연료 양는20.5입니다.

잘못된 연료양(-10.0)을 저장하겠습니다.

-10.0는 올바른 연료 양이 아닙니다.

연료 양을 바꿀 수 없습니다.

차량 번호는1234입니다.

연료 양는20.5입니다.

protect는 


슈퍼클래스에서  protected를 지정하게되면 상속 받은 서브 클래스는 부모클래스의 메소드나 변수를 사용할 수 있게 된다.(접근이가능하다

또한 패키지 이름이 다를때도 마찬가지이다.


캡슐화


클래스에 데이터(필드)와 기능(메소드)를 한 곳에 모은 다음, 보호하고 싶은 멤버에 private를 붙여 접근을 제한하는 기능을 일컬어 캡슐화(encapsulation)이라고 부릅니다. 


필드  ------ >  private 멤버
메소드 ------> public 멤버


메소드 오버로딩

class Car

{

private int num;

private double gas;

public void setCar(int n)

{

num = n;

System.out.println("차량번호를" + num + "으로 바꾸었습니다." );

}

public void setCar(double g)

{

gas = g;

System.out.println("연료 양을" + gas + "으로 바꾸었습니다.");

}

public void setCar(int n, double g)

{

num = n;

gas = g;

System.out.println("차량번호를" + num +"으로, 연료 양을"+ gas + "로 만들었습니다.");

}

public void show()

{

System.out.println("차량 번호는" + num + "입니다.");

System.out.println("연료 양는" + gas+"입니다.");

}

}


public class Sample2 {


public static void main(String[] args) {

// TODO Auto-generated method stub

Car car1 = new Car();

car1.setCar(1234, 20.5);

System.out.println("차량 번호만 변경 되었습니다.");

car1.setCar(2345);

car1.show();

System.out.println("연료량만 변경 되었습니다.");

car1.setCar(30.5);

car1.show();

}


}


차량번호를1234으로, 연료 양을20.5로 만들었습니다.

차량 번호만 변경 되었습니다.

차량번호를2345으로 바꾸었습니다.

차량 번호는2345입니다.

연료 양는20.5입니다.

연료량만 변경 되었습니다.

연료 양을30.5으로 바꾸었습니다.

차량 번호는2345입니다.

연료 양는30.5입니다.

 

 

코드를 보면 알수 이쓰시 setCar()메소드를 호출했다.
1. 인수가 2개인 메소드
2. 인수가 in형 메소드

3. 인수가 doubl 형은 메소ㅡ

 

여러개의 비슷한 메소드를 같은 이름으로 중복 정의(오버로딩)해두면 그 이름과 일치 하는 메소드 중
인수의 형과 갯구사 일치하는 메소드가 자동으로 호출된다.

 

 

setCar

setCar(int n)                     setCar(double g)         setCar(int n, double g)

setCar와 같은 하나의 이름이 상황에 맞추어 다른 기능을 가지는 것을 다형성이라고 부른다.

 

 

오버로딩 사용시 주의점

메소드는 그 인수의 형태와 수가 기존에 선언된 메소드와 달라야 한다.

int setCar(int n)

void setCar(int n)

 

setCar(1234);  ----> 컴퓨터 입장에서는 어느 메소드를 호출해야 하는지 알수 없다.

 

 

생성자의 역할

 

선언방법

제한자 클래스명 (인수 목록)

}

statement;

}

 

예를 들어 자동차클래스인 경우 다음과 같은 생성자를 작성할 수 있다.

 

public Car() 생성자는 리턴값이 없고, 클래스의 이름이 생성자의 이름이다.

{

num = 0;

gas = 0.0;

System.out.println("자동차가 만들어졌습니다.")

}

 

생성자의 이름은 메소드와 비슷하다. 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.

 

생성자는 그 클래스의 객체가 생성될때, 생성자 안의 코드가 자동으로 실행된다. 하지만 생성자는 메소드와 다르게 자유로이 호출할 수 없다. 따라서 객체의 멤버에 자동으로 초기 값을 설정하는 용도로 사용하는 것이 일반적이다.
에를 들어
차량 번호와 연료 양의 초기값을 0으로 대입하는 처리를 할 수 있겠다.

 

sample4.java 생성자 호출하기

class Car
{
 private int num;
 private double gas;
 
 
 
 public Car()
 {
  num = 0;
  gas = 0.0;
  System.out.println("자동차가 만들었습니다.");
  
 }
 public void show()
 {
  System.out.println("차량 번호는" + num + "입니다.");
  System.out.println("연료 양는" + gas+"입니다.");
 }
}

public class Sample2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Car car1 = new Car();
  car1.show();
  
 
 }

}


 

출력결과

자동차가 만들었습니다.
차량 번호는0입니다.
연료 양는0.0입니다.

 

main 메소드 안에서 객체가 생성되면 자동으로 생성자가 호출된다.

 

 

생성자 오버로딩하기

 

class Car
{
 private int num;
 private double gas;
 
 
 
 public Car()   인수없는 생성자
 {
  num = 0;
  gas = 0.0;
  System.out.println("자동차가 만들었습니다.");
  
 }
 public Car(int n, double g)  2개의 인수를 가지는 생성자
 {
  num = n;
  gas = g;
  System.out.println("차량 번호가" + num +"이며, 연료 양이"+ gas + "인 자동차가 만들어졌습니다.");
  
 }
 public void show()
 {
  System.out.println("차량 번호는" + num + "입니다.");
  System.out.println("연료 양는" + gas+"입니다.");
 }
}

public class Sample5 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Car car1 = new Car();
  car1.show();
  
  Car car2 = new Car(1234,20.5);
  car2.show();
 }

}

 

 

 

자동차가 만들었습니다.   // 생성자 1 Car();
차량 번호는0입니다.
연료 양는0.0입니다.
차량 번호가1234이며, 연료 양이20.5인 자동차가 만들어졌습니다. // 생성자2 Car(int n, double g)

차량 번호는1234입니다.
연료 양는20.5입니다.

 

 

첫 번째 자동차는 차량번호와 연료의 양을 0으로, 두 번째 자동차에서는 차량 번호 1234, 연료의 양을 20.5로 만들 수 있었다.

 

다른 생성자를 호출하기

 

sample6. java

 

class Car
{
 private int num;
 private double gas;
 
 
 
 public Car()
 {
  num = 0;
  gas = 0.0;
  System.out.println("자동차가 만들었습니다.");
  
 }
 public Car(int n, double g)
 {
  this(); 2개의 인수를 가지는 생성자의 시작 부분에서 인수 없는 생성자를 호출합니다.// 여기서는 Car()생성자가 호출되는것이다.

 이렇게 됨으로써 생성자가 동시에 호출되는 일석이조의 효과를 얻을 수 있다.

  num = n;
  gas = g;
  System.out.println("차량 번호가" + num +"이며, 연료 양이"+ gas + "인 자동차가 만들어졌습니다.");
  
 }
 public void show()
 {
  System.out.println("차량 번호는" + num + "입니다.");
  System.out.println("연료 양는" + gas+"입니다.");
 }
}

 

public class Sample5 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Car car1 = new Car();
  car1.show();
  
  Car car2 = new Car(1234,20.5);
  car2.show();
 }

}

실행 결과

자동차가 만들었습니다.
차량 번호는0입니다.
연료 양는0.0입니다.

자동차가 만들었습니다.  ---->this()호출에 따른 결과
차량 번호가1234이며, 연료 양이20.5인 자동차가 만들어졌습니다. 2개의 생성자가 동시에 호출되었다.

차량 번호는1234입니다.
연료 양는20.5입니다.

 

 

만약 생성자를 하나도 정의 하지 않은 경우, 객체를 생성 될때 인수없는 생성자가 호출된다.

 

생성자에 접근 제한자를 붙이기

 

 

class Car
{
 private int num;
 private double gas;
 
 
 
 private Car() private한 생성자
 {
  num = 0;
  gas = 0.0;
  System.out.println("자동차가 만들었습니다.");
  
 }
 public Car(int n, double g) public한 생성자
 {
  num = n;
  gas = g;
  System.out.println("차량 번호가" + num +"이며, 연료 양이"+ gas + "인 자동차가 만들어졌습니다.");
  
 }
 public void show()
 {
  System.out.println("차량 번호는" + num + "입니다.");
  System.out.println("연료 양는" + gas+"입니다.");
 }
}

 

public class Sample6 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  //Car car1 = new Car();   private 한 생성자의 호출을 통해서 객체를 생성할 수 없다.
  //car1.show();


  
  Car car2 = new Car(1234,20.5); public 한 생성자를 호출
  car2.show();
 }

}


실행결과

 

차량 번호가1234이며, 연료 양이20.5인 자동차가 만들어졌습니다.
차량 번호는1234입니다.
연료 양는20.5입니다.

 

 

인스턴스 변수

 

객체를 생성해야 객체의 num필드, gas 필드에 값을 대입하거나 출력할 수 있다. 이러한 관계를 필드 num과 gas는

클래스 Car에 연결되었다라고 부른다.

 

show()메소드 또한 객체를 생성하고 나서 비로소 호출할 수 있었다. 이 메소드 또한 객체와 연결되어 있다.

이처럼 각 객체와 연결된 필드를 가리켜 인스턴스 변수라고 부른다.

 



 

클래스 변수 클래스 메소드

 

클래스 전체와 연결된 필드를 클래스변수라고 부르고, 클래스 전체와 연결된 메소드를 클래스 메소드라고 부른다.
클래스 변수와 클래스 메소드는 선언할때 static이라는 제한자를 붙여야 한다. 객체를 생성하지 않아도 값을 불러올수있다.

 

클래스 변수의 선언

class 클래스 명

 

}

static 형명 클래스 변수 이름;

. . .

 

}

 

 

메소드의 정의

 

static 리턴 값의 형(type) 메소드(method) 명(인수 목록)

}

문장(statement);

}

 

클래스 변수와 클래스 메소드를 작성하기

 


class Car
{
 public static int sum = 0;  필드 변수 앞에 static을 붙인다. 클래스 변수 0으로 초기화
 private int num;
 private double gas;
 
 
 
 public Car()
 {
  num = 0;
  gas = 0.0;
  sum++; 생성자가 호출될때 , 클래스 변수 sum의 값을 1증가시킨다.
  System.out.println("자동차가 만들었습니다.");
  
 }
 public void SetCar(int n, double g)
 {
  num = n;
  gas = g;
  System.out.println("차량 번호가" + num +"이며, 연료 양이"+ gas + "인 자동차가 만들어졌습니다.");
  
 }
 public static void showSum() 클래스 메소드이다. 클래스 메소드 앞에는 static을 붙인다.
 {
  System.out.println("자동차는 모두"+ sum + "대 있습니다." );
 }
 
 public void show()
 {
  System.out.println("차량 번호는" + num + "입니다.");
  System.out.println("연료 양는" + gas+"입니다.");
 }
}


public class Sample7 {


  public static void main(String[] args) {
   // TODO Auto-generated method stub
   
   Car.showSum(); 클래스 메소드를 호출


   Car car1 = new Car();  객체를 생성한다.
   car1.SetCar(1234, 20.5);

 

   Car.showSum(); 다시 한번 메소드를 호출합니다.


   Car car2 = new Car(); 다시 한번 메소드 출력
   Car.showSum();
  }
 }

 

자동차는 모두0대 있습니다.
자동차가 만들었습니다.
차량 번호가1234이며, 연료 양이20.5인 자동차가 만들어졌습니다.
자동차는 모두1대 있습니다.
자동차가 만들었습니다.
차량 번호가4567이며, 연료 양이30.5인 자동차가 만들어졌습니다.
자동차는 모두2대 있습니다.

 

 

클래스 메소드는 객체를 생성하지 않더라고 호출할 수 있다.

 

클래스 메소드의 호출

클래스 이름. 클래스 메소드(인수 목록);

 

Ex) Car.showsum();

 

클래스 메소드 사용시 주의점

 

public static void showsum()
{

//잘못된 코드

// system.out.println("자동차는 모두 " + this.sum +" 대 있습니다")----> 클래스 메소드 안에서는 this.를 사용할 수 없다.

}

 

클래스 메소드는 객체가 생성되지 않은 상태에서도 호출될 수 있어야 하기 때문에

클래스 메소드가 특정 객체와 연결된 인스턴스 변수와 인스턴스 메소드에 대해 접근 불가능 하다.

 

 

public static void showsum()
{

//잘못된 코드

// system.out.println("자동차는 모두 " + num +" 대 있습니다")----> 클래스 메소드 안에서는 this.를 사용할 수 없다.

}                             

 

num은 특정 개체와 연결된 필드변수(인스턴스변수)이기 때문에 객체가 생성되지 않아도 호출해야 하므로

클래스 메소드 안에서는 인스턴스 변수가 접근 불가능하다.

 


final



public class Application {

public static void main(String[] args) {
// TODO Auto-generated method stub
final int ID = 1;// 중간에 값을 절대로 바꿀수없다.
ID = 3;  //에러 표시




'프로그래밍 > java' 카테고리의 다른 글

상속-1  (498) 2017.09.01
클래스 이용  (510) 2017.08.30
클래스(메소드 인수, 리턴 값)  (488) 2017.08.27
클래스(클래스, 객체, 필드, 메소드,getter&&setter)  (459) 2017.08.26
배열  (494) 2017.08.25