자바에서 모든 코드는 반드시 클래스 안에 존재해야 하며
서로 관련된 코드들을 그룹으로 나누어 별도의 클래스 구성
클래스들이 모여 하나의 Java 애플리케이션 구성
public class 클래스명 {
}
// 주석을 제외한 모든 코드 블록 { } 내 작성
클래스의 기능(동작)에 해당하는 구현 부분으로
해당 메소드 호출 시 메소드의 블럭( { } )에 해당하는 부분 실행
public class 클래스명 {
public void 메소드명() {
// 실행될 문장
}
}
‘public static void main(String[] args)’는 main 메소드의 고정된 선언부
프로그램 실행 시 java.exe에 의해 호출됨
모든 클래스가 main메소드를 가지고 있어야 하는 것은 아니지만
하나의 Java애플리케이션에는 main메소드를 포함한 클래스가 반드시 하나는 있어야 함public class 클래스명 { // public static void main(String[] args) { // 실행될 문장 } }
System.out.print( )
() 안의 변수, 문자, 숫자, 논리 값을 모니터에 출력해주는 메소드
System.out.println( )
print문과 동일하게 출력하면서 자동으로 출력창에 줄바꿈 해주는 메소드
1. 클래스명 --> 대문자로 시작
2. 패키지명 --> 소문자로 시작
3. 메소드명 --> 소문자로 시작
4. 변수명 --> 소문자로 시작
여러개의 단어가 있을 때는 단어 앞자리마다 대문자로 => 낙타표기법
ex) 클래스명 Methodprinter => MethodPrinter
메소드명 printvalue => printValue
항상 의미있게 이름짓기
1) 클래스 생성 먼저
=> 클래스명 사용할이름 = new 클래스명();
2) 메소드 호출(실행)
=> 사용할이름.실행할메소드명();
패키지: 서로 연관된, 비슷한 성격의 클래스를 모아서 이름을 붙인 것
클래스: 서로 연관된 변수와 메소드를 모아서 이름을 붙인 것
(Math 클래스에는 max, min, pi...)
java가 기본적으로 제공하는 클래스는 사천개 정도 있는데 이 클래스들이 정리가 되어있지 않으면 찾기 어려울 것이다. 또한 이미 Math 클래스가 있는데 Math라는 이름의 자신의 클래스를 만들고 싶을 때, 똑같은 이름이 같은 공간에 있을 경우 충돌하기 때문에 정리 정돈이 필요하다. 따라서 이를 위한 도구가 바로 패키지다.
이 Math 클래스는 java.lang이라는 패키지에 속해있는 것!
import java.io.FileNotFoundException;
import java.io.PrintWriter;
public class InstanceApp {
public static void main(String[] args) throws FileNotFoundException {
PrintWriter p1 = new PrintWriter("result1.txt");
p1.write("Hello 1");
p1.close();
PrintWriter p2 = new PrintWriter("result2.txt");
p2.write("Hello 2");
p2.close();
// result1, rsult2 파일 생성!
}
}
빨간색 밑줄?
PrinterWriter는 Math 클래스와 달리 자바에 내장되어있긴 하지만 특별한 작업을 해야한다.
=> package를 가져오는 작업, import ! (import java.io.PrintWriter;)
그래도 빨간줄?
파일을 읽으려고 하는데 파일이 없을 때 문제가 될 수 있다. 이런 예외상황을 처리해줘야 함!
그런데 굳이 왜 이렇게 할까? 인스턴스를 쓰지 않으면 어떤 불편함이 있을까?
`PrintWriter.write("result1.txt", "Hello 1");`
`PrintWriter.write("result2.txt", "Hello 2");`
`PrintWriter.write("result3.txt", "Hello 3");`
이렇게 클래스에다 직접 write하는 방식은 write 할때마다 어떤 파일을 수정할지 기술해야 하는 불편함이 있다. 지금 여기 있는 PrintWriter는 PrintWriter라고 하는 하나의 클래스를 write메소드가 서로 돌려 쓰고 있다.
하지만 위에서의 PrintWriter는 new를 통해 인스턴스를 만들었고, 그 인스턴스는 내부적으로 각자의 상태를 가지고 있다. p1은 result1.txt, p2는 result2.txt 라는 내부적인 상태를 내장하고 있기 때문에 p1.write는 result1에 대한 것, p2.write는 result2에 대한 상태이다.
Math 클래스 같은 경우는 일회성 작업, 짧은 맥락에서 사용된다.
그런데 파일을 수정하는 것은 파일 하나만 수정하는 게 아니라 그 파일에 관한 후속 작업이 들어오게 되고, 동시에 여러 개의 파일을 작업하게 될 수도 있다. (클래스가 하는 작업이 긴 맥락)
이런 경우, 하나의 클래스를 사용하는 것보다 해당 클래스를 new를 통해 복제해서 각각의 다른 상태를 가진 인스턴스를 만들어 사용하는 것이 더 효율적이다.
constructor 생성자 : 생성자가 없으면 일회용, 생성자가 있으면 인스턴스를 만드는 것이 허용
어떤 클래스를 사용할 때, 그 클래스를 만든 사람이 클래스를 인스턴스로써 활용하기를 원한다면 constructor라는 것을 가지고 있다.
constructor앞에 new를 붙이면 그것이 복제되어서 인스턴스가 되고,
그 인스턴스에 어떤 값이 올 수 있느냐를 규제하기 위해 앞에 PrintWriter라는 클래스 이름을 적는다.