14. 자바 기초(7)
자바의 기초 언어를 공부하자.
인스턴스와 메서드
- 인스턴스 : 피연산자 / 메서드 : 연산자
1
레퍼런스.메서드( - );
- 레퍼런스 : 도구를 실행하는데 사용할 기본 데이터가 있는 인스턴스의 주소
도구를 실행할 때 필요한 데이터 (= 피연산자(operand)) - .메서드( - ): 도구와 도구를 실행할 때 사용할 추가 데이터 (= 연산자(operator)), ( - )는 추가 피연산자이다.
클래스 메서드와 인스턴스 메서드
클래스 메서드
1
Math.abs(-100) // =100
- Math = 클래스 : abs 도구를 실행하는데 기본 데이터는 필요없다.
- abs = 메서드 : abs( - )를 실행할 때 사용할 데이터 == 아규먼트(argument)
인스턴스 메서드
1
System.out.println("Hello");
- out = 인스턴스 : println() 도구를 실행하는데 필요한 기본 데이터, println = 메서드, (“Hello”); = 추가 데이터
- 라고 설명은 해주셨지만… 따지자면 println만 PrintStream 클래스의 인스턴스 메서드이다.
여기서 System이라는 클래스가 인스턴스 PrintStream를 클래스 변수로 호출하게 되고 이 변수의 이름이 out인 것.
그래서 System. 을 부르면 클래스 변수인 out이 나오게 되고 자연스레 그 안에 있는 println도 static 화 된것이다.
- 라고 설명은 해주셨지만… 따지자면 println만 PrintStream 클래스의 인스턴스 메서드이다.
내가 이해를 위해 정리해본 설명서
- 인스턴스 메서드와 클래스 메서드의 가장 큰 차이는 static의 여부이다.
- static은 호출 될 때 인스턴스가 생성되는 것이 아닌 실행과 동시에 메모리에 할당이 된다.
- 그렇기 때문에 static이 붙는 클래스 메서드는 따로 객체를 생성할 필요가 없고 클래스명.메서드명()으로 메모리에서 바로 읽어오면 되는것이다.
- 그렇기 때문에 static이 붙지않는 인스턴스 메서드는 이를 호출하기 위해 객체를 할당해줘야하고 할당 후 객체.메서드명()으로 호출이 가능하다.
대충 예시를 들기 위해 이와 비슷하게 코드를 짜봤다.
1 2 3 4 5 6 7 8
// 이 Main Class가 System Class의 느낌이다. // 가장 큰, 밖에 있는 Class. public class Main/*(= System)*/ { public static final ABC abc = new ABC(); //그리고 이 ABC 클래스를 가진 abc 변수가 out이다. PrintStream의 클래스를 가진 클래스 변수. public static void main(String[] args) { abc.drive("test"); } }
1 2 3 4 5 6 7 8 9 10 11 12
// 이 ABC 클래스가 out 변수가 가지고 있는 PrintStream의 클래스 느낌이다 public class ABC { public ABC(){ } // 그리고 이게 최종적으로 PrintStream(=out)이 가지고 있는 println 메서드 같은 느낌. public void drive(String go){ System.out.println(go); } } //그래서 이 drive를 쓰기 위해서는 Main을 불러와서 abc를 찍고 drive를 사용 가능한 것이다. -> Main.abc.drive() == System.out.println()
인스턴스 메서드
- static이 붙지않은 메서드
- 사용을 위해서 클래스를 객체로 만들어야하고 객체.메서드명()으로 사용가능하다
- 주로 큰 틀보다 작은 기능 단위의 메서드가 많다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
public class Car { // 인스턴스 변수 private String name; private String color; // 생성자 public Car(String name, String color) { this.name = name; this.color = color; } // 인스턴스 메서드 public void drive() { System.out.println(this.name + " is driving."); } public void stop() { System.out.println(this.name + " has stopped."); } // main 메서드 - 프로그램 실행 진입점 public static void main(String[] args) { // Car 객체 생성 Car myCar = new Car("Tesla", "Red"); // 인스턴스 메서드 호출 myCar.drive(); // "Tesla is driving." myCar.stop(); // "Tesla has stopped." } }
클래스 메서드
- static이 붙은 메서드
- 사용을 위해서 객체 생성이 필요가 없다. 클래스명.메서드명()으로 호출이 가능하다.
- 작은 기능 보다는 큰 틀의 메서드가 많다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
public class Car { // 클래스 변수 private static String type = "Sedan"; // 인스턴스 변수 private String name; private String color; // 생성자 public Car(String name, String color) { this.name = name; this.color = color; } // 클래스 메서드 public static String getType() { return type; } public static void setType(String carType) { type = carType; } // main 메서드 - 프로그램 실행 진입점 public static void main(String[] args) { // 클래스 메서드 호출 System.out.println(Car.getType()); // "Sedan" Car.setType("SUV"); System.out.println(Car.getType()); // "SUV" } }
애플리케이션 표준입력, 표준출력, 표준오류의 시스템 정보
표준 입력 : System.in / 표준 출력 : System.out / 표준 오류 : System.err
- in : 기본 입력 정보, out : 기본 출력 정보, err : 오류 출력 정보 만약 파일을 읽어오고 싶다면… FileInputStream / FileOutputStream
표준 입력 제어
들어가기전.. 출력에 대해
console ⇒stdIn(standard.in)⇒ word count(wc) ⇒ console
1 2 3 4
wc aaa bbb ccc // 후 Ctrl + D 입력시 // 결과 1 3 12 <- 1 : 1줄, 3개 단어, 12개의 문자
이걸 echo를 통해 wc로 출력하려고 할 때 연결하는 망을 pipe line 이라고 함
argument→ echo ⇒[stdOut]⇒ |(pipe line)| ⇒[stdIn]⇒ word count(wc) ⇒ console
1 2
echo "aaa bbb ccc" // 원래 결과값 : aaa bbb ccc echo "aaa bbb ccc" | wc // | (파이프 라인)으로 wc와 연결 시 1 3 12로 출력됨
println( - ) 과 출력 시스템 정보(= 데이터를 어디로 출력해야 하는지에 대한 정보 = 출력스트림)
출력스트림.println( - );- System.out : 콘솔창으로 출력
- 파일 출력 스트림 : 파일로 출력
- 소켓 출력 스트림 : 네트워크로 출력
read( - )와 입력스트림
- 입력스트림.read( - ); ⇒retrun⇒ 1byte
- System.in → console 키보드 입력으로부터 읽음
- 파일 입력 스트림 → 파일에서 읽음
- 소켓 입력 스트림 → 네트워크에서 읽음
Scanner 인스턴스와 입력스트림
Scanner 인스턴스 → next( - ), nextInt( - ), nextLine( - ) 메서드를 사용 가능 함. (이때 사용 = call)
이때 사용을 위해 입력 스트림을 정해야함 → System.in : 콘솔, 파일 입력 스트림, 소켓 입력 스트림
- next( - )
Scanner의 인스턴스.next( - ); ⇒retrun⇒ 1개의 토큰(=공백으로 구분된 문자열)
→ new Scanner( - ) ← 스캐너와 연결된 입력 스트림 ex. System.out
nextLine( - ) 사용법
1 2 3 4 5
aaa bbb⏎ // nextLine() : "aaa bbb" - 줄바꿈 코드 제거 aaa⏎ // nextLine() : "aaa" - 줄바꿈 코드 제거 a b c⏎ // nextLine() : "a b c" - 줄바꿈 코드 제거
nextInt( - ), nextFloat( - ), nextBoolean( - )
1
입력: 100 3.14 true⏎
- nextInt( - ) : 공백을 만나기 전까지 읽음 100 → int로 변환
- nextFloat( - ) : 공백을 만나기 전까지 읽음 3.14 → 공백 제거 후 float으로 변환
- nextBoolean( - ) : 엔터나 공백을 만나기 전까지 읽음 true → 공백 제어 후 boolean으로 변환
nextInt( - )와 nextLine( - )
1
이름?: 20⏎
- nextInt( - ) → int값을 받아오고 공백 제거 → 20
- nextLine( - ) → 나머지 엔터를 받아오고 엔터 제거 → 빈 문자열
nextInt( - ), next( - ), nextBoolean( - )
1
나이, 이름, 취업여부?: 20 홍길동 false⏎
nextInt( - ) : 20 / next( - ) : “홍길동” / nextBoolean( - ) : false
next( - )
1
aaa bb cccc⏎
- next( - ) : “aaa” / next( - ) : “bb” / next( - ) : “cccc”
Parameter(매개변수)와 Argument(인자)
1
2
3
int parseInt(String s){ - } // s : parameter = 아규먼트를 담을 변수
Integer.parseInt("-"); // ("-") : argument = 메서드를 호출할 때 파라미터에 전달하는 값
String 사용법
1
2
3
4
5
6
String s; // reference(= 주소 값)
s = new String("aaa"); //인스턴스 화
+--------+ +--------------------------+
s -------->| 레퍼런스 |-------->| "aaa" (String 객체) |
+--------+ +--------------------------+
- primitive clata type(byte, short, int, long, float, double) 다른 모든 데이터 타입(+ 배열)의 변수는 레퍼런스(인스턴스의 주소를 담는 변수)다.
- String s2 = new String(“aaa”); ← 200[“aaa”] ← String 인스턴스
상수 스트림
1
2
3
String s = "aaa"; // s의 "aaa" : String literal 은 별도의 영역에서 관리됨
String s2 = "aaa"; // s2의 "aaa" : String 리터럴 영역에 같은 문자열을 가진 인스턴스가 있다면 기존 인스턴스의 주소를 리턴한다.
// 만약 없다면 새로 만든 후 인스턴스 주소를 리턴한다.
String 배열
1
String[] menus = new String[]{"1", "2", "3"}; // menus 레퍼런스의 배열...
스트링 리터럴은 그냥 빈곳에 아무데나 생성함 nextLine은 같은 단어라도 새로운 레퍼런스를 생성함
메서드
- 명령문 묶음
- UML(Unified Modeling Language)을 사용해서 코드를 글과 그림으로 표현