Wanna be Brilliant Full-Stack Developer

JAVA 객체지향 프로그래밍 문법 #1 본문

Some Memos/Java

JAVA 객체지향 프로그래밍 문법 #1

Flashpacker 2022. 3. 2. 15:04

 


Package라는것이 도대체 무엇일까? 이건 .java 파일을 들고있는 애들을 패키지라고 한다.

패키지는 .java파일의 모임이다.

package ch04;

public class PackageEx01 {
	public static void main(String[] args) {
		
	}
}

맨위에 Package라는 키워드가 보인다! PackageEx01이라는 파일은 ch04라는 패키지 이하에 있다라는 뜻이다. 

저게 없으면 오류가난다! 

 


Import! 

수입하다 가져오다라는 단어의 뜻을 가지고 있는 Import!

자바에서 말하는 Import는 무엇일까?

내가 A라는 패키지가 있고 Cal.java를 만들었다. 또 B라는 패키지를 만들고 여기에서 App.java를 만들었다

App.java에서 Cal.java를 사용하고 싶으면 서로에대한 패키지가 다르다. 

다른 패키지에 있는 클래스를 사용하고자 할때 Import 해야한다. 

패키지를 만들때 . 점을 붙이고 만들면 하위패키지라는것이다. 

package ch04.a;

public class Cal {

	void add() {
		System.out.println("더하기 메서드");
	}
	
	void minus() {
		System.out.println("뺴기 메서드");
	}
}

이렇게 ch04.a패키지에 만들었고 ch04.b에서 사용하고싶으면 어떻게 해야할까?

main이 있는 Java 파일을 실행파일이라고 한다!

main이 없는 자바파일은 실행파일이 아니다. 

 

package ch04.b;

//main이 있는 자바파일은 실행파일이라고한다!
public class App {

	public static void main(String[] args) {
		

	}

}

여기서 저거를 엔터를 치면 Import가 된다!

'두번쨰는 Import하려면 import ch04.a.Cal; 이렇게 직접 입력할 수 도있다! 

 

Cal은 static을 안들고있다. 메모리에 뜬게 없다는 뜻이다. 메모리에 뜬게 없으면 애를 사용하고 싶으면
new를 해서메모리에 올려야하는데 new를 하면 Heap에 뜰것이다. 

cal c = new Cal(); 이렇게 하면 메모리에 올렸으니까 heap공간에 떴다.

package ch04.b;

import ch04.a.Cal;

//main이 있는 자바파일은 실행파일이라고한다!
public class App {

	public static void main(String[] args) {
		Cal c = new Cal();

	}

}

근데 여기서 c.minus(); , c.add(); 하면 각각의 메서드를 사용할수가 없다 왜 사용못하는지는 접근제어자 설명을 통해 이해 해보자!


접근 제어자란 무엇인가? 

다른 패키지에 있는 , 같은패키지에 있지만, 다른 클래스에 있는데 여기에 어떻게 접근하느냐 배울것이다.

A라는 패키지가 있고, B라는 패키지가 있다

A에 Cal.java 파일이 있고 B에는 App.java 파일이 있다. B에 또 Hello.java 파일이 있다. 

App.java 관점에서 보면 A패키지는 다른 패키지이다. 

Cal은 다른 패키지에 있고 Hello는 동일한 패키지에 있다.


이말은 App(B패키지) 이 Cal(A패키지)을 쓰고 싶으면 Import해야하고,

Hello(B패키지) 를 쓰고 싶으면 Import를 할필요 없다.
같은 패키지는 임포트 할필요 없다 왜냐하면 같은 공간에 있기 때문에! 

 

접근제어자는 다른 개념이다. 

Cal의 내부를 보면 메소드 가 두개가 있었다. Add (), Minus() 

이떄 Add 메서드 앞에 아무것도 안붙어 있는데 void는 리턴할게 있다 없다일뿐 접근에는 상관없다. 

아무것도 안붙어 있는걸 뭐라 말하냐면 Default접근 제어자라고 한다.( 동일한 패키지에서만 접근이 가능하다

App.java에서는 C.add가 안찾아진다. 왜냐하면 디폴트 접근제어자이기 떄문에 

a 패키지 안에 App2(실행파일 A패키지) 의 관점으로보면 Cal은 같은 패키지에 있기 떄문에 디폴트 접근 제어자를 가지고있는 Add와 Minus가 사용이 가능하다. 

같은 패키지이기떄문에 Cal을 import할필요도 없다. 

Cal에 있는 메소드들을 다른 패키지에서도 사용하려면? add와 Minus를 두번쨰 접근제어자를 사용해야한다

Public접근제어자이다. ( 다른 패키지에서도 접근이 가능하다, 결국 모든곳에서 접근이 가능하다

public 접근제어자가 붙어 있는거와 안붙어 있으면 디폴트 제어자이다. 

 

package ch04.a;

public class Cal {

	void add() {
		System.out.println("더하기 메서드");
	}
	
	public void minus() {
		System.out.println("뺴기 메서드");
	}
}

minus 메소드에 public접근제어자가 있기떄문에 다른패키지에서도 사용이 가능하다

package ch04.a;

public class Cal {

	void add() {
		System.out.println("더하기 메서드");
	}
	
	public void minus() {
		System.out.println("뺴기 메서드");
	}
	
	private void multi() {
		System.out.println("곱하기 메서드");
	}
}

private 접근 제어자는 ( 동일한 클래스에서만 접근이 가능하다) 

package ch04.a;

public class Cal {

	void add() {
		System.out.println("더하기 메서드");
	}
	
	public void minus() {
		System.out.println("뺴기 메서드");
	}
	
	private void multi() {
		System.out.println("곱하기 메서드");
	}
	
	public void divide() {
		System.out.println("나누기 메서드");
		multi();
	}
}

private으로 선언한 메서드는 같은 클래스안에서만 부를수있기떄문에 divide 메서드 안에서는 가능하지만

package ch04.a;

public class App2 {

	public static void main(String[] args) {
		Cal c = new Cal();
		c.add();
		c.minus();
		// c.multi(); 찾을 수 없다. 같은 클래스가 아니기 떄문에!!
	}
}

 

같은 패키지안에 있는 App2클래스에서는 호출하지 못한다. 

여기 App.java 앞에도 public이 붙어있다. Cal 클래스앞에도 public이 붙어있는데 이 public을 지우면?

App.java에서 오류가난다. 왜냐하면 임포트가 안되어있기떄문에! 

공개 되어있지 않기 떄문에! 클래스자체가 public이 안붙어 있으니까 b패키지에서 a패키지의 Cal을 접근 불가

임포트 자체가 불가능하다.

 

public , default, private 접근제어자는 Class 명앞에도 붙고, 메소드 앞에도 붙지만

변수 이름 앞에도 붙을수 있다. 

package ch04.a;

public class Cal {
	
	int num = 10;

	void add() {
		System.out.println("더하기 메서드");
	}
	
	public void minus() {
		System.out.println("뺴기 메서드");
	}
	
	private void multi() {
		System.out.println("곱하기 메서드");
	}
	
	public void divide() {
		System.out.println("나누기 메서드");
		multi();
	}
}

int num 디폴트 접근제어자로 되어있기떄문에  App.java에서는 사용할수 없다.

하지만 App2.java에서는 부를수 있다. 왜냐하면 같은 패키지에 있기 때문에!

 

package ch04.b;

import ch04.a.Cal;

//main이 있는 자바파일은 실행파일이라고한다!
public class App {

	// JVM이 main 메서드를 찾으려면 public이 필요하다!  (공개)
	// JVM이 main 메서드를 찾으려면 static이 필요하다!  (메모리에 올린다)
	public static void main(String[] args) {
		Cal c = new Cal();
		c.minus();

	}

}

 

App.java에 Main메소드에도 public이 있는데?!

public이 없으면 못찾는다.. public 없이 실행하면 메모리에 떳다 하더라도 static이니까 static 공간에 떳지만 찾을 수 없다. Main method는 찾을 수 없다고 나온다. 

static이 없어도 메모리에 안떴으니까 JVM이 메인메서드를 찾을 수 없다. 

메모리에 올라와있고 공개가 되어있어야 JVM이 찾을 수 있는것이다. 

 

그러면 메인 메서드에서 void 가 없으면 말이될까? 메서드에는 Return 타입이 있어야한다. 

리턴 안할꺼면 void, 리턴할꺼면 머라도 적어야한다? Int 하지만 오류가 나온다 

 

메인 메서드는 void 타입 말고는 다른 타입을 문법적으로 허용하지 않는다.

메서드는 원래 허용하는데 Main 메서드만 return 타입을 허용하지 않는다!

Main 메서드의 공간은 코드가 실행되는 공간 Stack의 영역이다,
14, 15 ,16 번은 큐에 담겨서 순차적으로 실행되고

Cal c라는 변수는 원래 자바가 들고있는것이 아니라 내가 만든것이기 떄문에
Cal c라는 변수는 지역변수이다 왜?

이 스택 내부에서 만들어졌기떄문에 지역변수다

메소드 내부에서 만든 변수는 다  지역변수다 

App. java에 서 Main 메서드에서
new 하면 어떻게 될까? Cal 클래스에 Static이 아닌 모든것들이 메모리에 뜬다! 


디폴트 접근 제어자 :
아무것도 안붙어 있는걸 뭐라 말하냐면 Default접근 제어자라고 한다.
( 동일한 패키지에서만 접근이 가능하다) 

Public 접근 제어자 : 

Public접근제어자는 ( 다른 패키지에서도 접근이 가능하다, 결국 모든곳에서 접근이 가능하다) 

Private 접근 제어자는 ( 동일한 클래스에서만 접근이 가능하다)