[Java] 4. 클래스와 정보은닉

Kyunghwan Ko·2022년 9월 26일
0

Java

목록 보기
5/14

01.생성자

  • 객체가 생성될 때 필드에 초기화값을 제공하고 초기화 절차를 실행하는 (함수) 메소드
  • 생성자도 함수다!
  • new 뒤에 생성자 함수를 사용한다.
  • 생성자 함수 = 객체를 생성할때 쓴다

생성자 특징

  • 리턴타입이 없다.
  • 클래스 이름과 함수 이름이 같다.
  • 파라미터를 통해 초기화 가능하다. (파라미터 없을 수 도 있음)

생성자의 활용

  • new를통해 객체를 생성할 때 생성자를 실행하여 필드 값을 초기화 한다.
  • 생성자 함수가 없다면 기본생성자를 자바 컴파일러가 만든다.

기본 생성자

생성자를 하나라도 만들었다면 기본생성자(디폴드생성자)를 꼭 정의해줘야 한다.

  • 개발자가 생성자를 하나도 정의하지 않으면 자바 컴파일러가 기본생성자를 만든다.
  • 예제
    class A{
    	
    	// 기본 생성자를 만들어야 한다.
    	
    	// 생성자
    	public A(String str) {
    		System.out.println(str);
    	}
    	
    }
    
    public class Switch {
    
    	public static void main(String[] args) {
    		A a = new A("안녕하세요");
    		
    		// 개발자가 만들어 놓은 생성자가 있기 때문에
    		// 컴파일러는 디폴트 생성자를 생성하지 않는다.
    		// 따로 만들어 줘야 한다.
    		A aa = new A(); // 디폴트 생성자가 없어서 오류
    	}
    }

02. This

  • this는 컴파일러에서 자동으로 생성한다.
  • 현재 객체 자신을 가리키는 참조변수이다.
  • 생성자에서 매개변수와 필드이름의 혼동을 막기 위해 사용

  • this()함수는 다른 생성자를 호출한다.
  • this() 사용시 제일 위에서 사용해야한다.
  • 파라미터가 동일한 생성자 기준으로 다른 생성자를 호출한다.

  • 예제
    class Person{
    	
    	String name;
    	String passport = "0000000";
    	
    	public Person(String name) {
    		this.name = name;
    	}
    	
    	public Person(String name, String passport) {
    		//this생성자 함수 호출할때는 제일 위에서 실행해야한다.
    		this(name); //this()함수 사용하여 다른 생성자를 호출했다.
    		this.passport = passport;
    	}
    
    	
    }
    
    public class Switch {
    
    	public static void main(String[] args) {
    		Person kim = new Person("김말똥");
    		Person hong = new Person("홍길동", "0000-0000");
    		
    	}
    }

03. 접근 제한자와 정보은닉

접근 제한자(Access Modifier)

  • 클래스 : public, default(아무 키워드도 안쓰면 default를 의미함)
  • 메소드, 변수 : public, protected, default, private

클래스의 접근 제한자

  • public: 어디서든 인스턴스 생성이 가능하다.
  • default: 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성을 허용한다. 즉, 다른 패키지에서는 인스턴스 생성이 불가능하다!!
  • 예제: 다른 패키지에서 default로 클래스를 정의해 놓은 경우, 다른 패키지에서 인스턴스 생성이 불가능

    import edu.lion.car.Hcar;
    import edu.lion.car.Scar; //컴파일 에러
    
    public class JvmTest {
    
    	public static void main(String[] args) {
    		Hcar hcar = new Hcar();
    		Scar scar = new Scar(); //컴파일 에러
    	}
    }

위와 같이 컴파일 에러가 발생하는 이유는 Scar.java에서 Scar 클래스default로 설정해주었기 때문이다. 다른 패키지에 있는 JvmTest 클래스에서 다른 패키지에 있는 클래스의 인스턴스를 생성하려면 public으로 정의되어있는 것만 접근 가능하다.

다른 접근 제한자(변수, 메소드)

  • private: 자기 클래스 내에서만 접근이 가능하다. 외부(다른 클래스, 다른 패키지)에서는 접근이 불가능 하다.
  • default: 같은 패키지 내의 클래스에서는 접근이 가능하다. 즉, 다른 패키지에서는 접근이 불가능!!
  • protected: 같은 패키지 내의 클래스에서 접근이 가능하고, 추가적으로 다른 패키지라도 해당 클래스를 상속받는 자식 클래스에서는 접근이 가능하다.
  • public: 어디서든 다 접근이 가능하다.

  • 그림

(출처 : https://gyrfalcon.tistory.com/entry/JAVA-접근-제한자)

주의사항들

  1. 하나의 자바 파일에는 반드시 한개의 public class(파일명과 동일한 클래스명을 가짐)만 들어간다.
  1. 생성자도 메서드이다! 따라서 생성자도 접근 제한자를 잘 설정해주어야 올바른 객체 생성이 가능하다. 클래스는 public으로 설정했는데 생성자는 default로 한 경우, 참조형 변수 선언은 가능하지만 객체가 생성되지는 않는다.

04. 정보은닉(Information Hiding)

정보은닉의 필요성

  • 변수에 직접적으로 접근하지 못하도록 제한함.
  • 정보를 보호해주는 것임.
  • 메서드를 통해서 값을 접근하도록함
    • private double rad = 0; 으로 설정해주면 -4.5로 설정되지 않을 것임.

Tips

1. 모든 변수를 되도록 private으로 선언한다.

2. 모든 변수에 대해서 getter, setter 함수를 만들어서 값을 읽고 쓴다.

⭐ 정확하게는 외부에서 필드의 값을 변경하기 위해 접근할 때,

단순하게 setXXX()라는 이름의 메서드(setRad()) 하나만 덜렁 주지 말고,

changRad(double r) 와 같이 필드의 값을 변경하려는 목적을 제대로 파악하여

그 목적을 잘 표현하는 메서드를 구현하는 것이 더 좋다.

05. 패키지(Package)

1. 패키지란?

  • 비슷한 성격의 자바 클래스들을 모아놓은 것으로, 내장 패키지사용자 정의 패키지로 분류할 수 있다.
  • 패키지의 이름은 모두 소문자로 구성된다
  • 인터넷 도메인 이름의 역순으로 이름을 구성하고, 이름의 끝에 클래스를 정의한 팀 또는 프로젝트의 이름을 추가한다.

    ex.

    도메인패키지 및 클래스 경로
    www.wxfx.comcom.wxfx.smart

2. 패키지가 필요한 이유

2-1) 같은 위치에 똑같은 이름의 클래스 파일(.java)을 둘 수 없다.

패키지 com.wxfx.smart는 com이라는 폴더에 wxfx라는 폴더에 있는 smart라는 폴더에 클래스를 위치시켜 동일한 이름의 클래스가 다른 위치에 놓이도록 한다

2-2) 다른 위치에 있는 똑같은 이름의 클래스를 실행하면 동일한 이름의 인스턴스가 생성되어 충돌이 일어난다.

다른 위치에 있는 똑같은 이름의 클래스를 가져오고 싶은 경우 패키지 이름까지 가져온다

// 클래스 이름이 Circle로 동일함

com.wxfx.smart.Circle circle1 = new com.wxfx.smart.Circle();
com.fxmx.simple.Circle circle1 = new com.fxmx.simple.Circle();

3. 터미널을 이용하여 컴파일, JVM 동작 시키기

3-1) 소스코드 컴파일

javac <클래스 이름>.java

→ 클래스 파일 <클래스 이름>.class 생성

ex.  javac JavaProject.java 

3-2) 클래스를 JVM에 올리기

java <클래스 이름>
: 이때 <클래스 이름>.class가 아니라 <클래스 이름>만 입력 !!
ex. java JavaProject

4. JVM이 클래스를 찾는 3가지 방법

4-1) 주어진 것이 없으면 현재 디렉터리부터 찾는다

4-2) 환경변수 classpath에 해당 클래스가 위치한 경로를 설정해준다.

(터미널의 경로 자체 변경)

경로를 설정해주면 terminal이 해당 경로에서 실행된다.

set classpath = <클래스가 위치한 경로>

set classpath = C:\Users\kyung\Documents\workspace-sts 3.9.11.RELEASE\java_jvm\src 

4-3) 가상 머신을 실행할 때 -classpath라는 옵션을 이용한다.(JVM을 실행할 때에만 변경)

→ 가장 권장되는 방법

실행 후에는 원래의 디렉토리에서 터미널이 실행된다.

java -classpath <경로> java <클래스 이름>

 ex. java -classpath  C:\Users\kyung\Documents\workspace-sts-3.9.11.RELEASE\java_jvm\src java JavaProject 

💡 classpath란 무엇인가?

터미널이 실행되는 경로를 받아주는 환경변수, set classpath를 하면 터미널이 실행되는 경로를 설정할 수 있다.

profile
부족한 부분을 인지하는 것부터가 배움의 시작이다.

0개의 댓글