포스트

14. 자바 기초(7)

자바의 기초 언어를 공부하자.

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 화 된것이다.
내가 이해를 위해 정리해본 설명서
  • 인스턴스 메서드와 클래스 메서드의 가장 큰 차이는 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 : 콘솔, 파일 입력 스트림, 소켓 입력 스트림

  1. next( - )
    • Scanner의 인스턴스.next( - ); ⇒retrun⇒ 1개의 토큰(=공백으로 구분된 문자열)

      → new Scanner( - ) ← 스캐너와 연결된 입력 스트림 ex. System.out

  2. nextLine( - ) 사용법

    1
    2
    3
    4
    5
    
     aaa bbb     // nextLine() : "aaa bbb" - 줄바꿈 코드 제거
        
     aaa         // nextLine() : "aaa"     - 줄바꿈 코드 제거
        
     a   b c     // nextLine() : "a   b c" - 줄바꿈 코드 제거
    
  3. nextInt( - ), nextFloat( - ), nextBoolean( - )

    1
    
     입력: 100   3.14   true
    
    • nextInt( - ) : 공백을 만나기 전까지 읽음 100 → int로 변환
    • nextFloat( - ) : 공백을 만나기 전까지 읽음 3.14 → 공백 제거 후 float으로 변환
    • nextBoolean( - ) : 엔터나 공백을 만나기 전까지 읽음 true → 공백 제어 후 boolean으로 변환
  4. nextInt( - )와 nextLine( - )

    1
    
     이름?: 20
    
    • nextInt( - ) → int값을 받아오고 공백 제거 → 20
    • nextLine( - ) → 나머지 엔터를 받아오고 엔터 제거 → 빈 문자열
  5. nextInt( - ), next( - ), nextBoolean( - )

    1
    
     나이, 이름, 취업여부?: 20   홍길동   false
    

    nextInt( - ) : 20 / next( - ) : “홍길동” / nextBoolean( - ) : false

  6. 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 배열

스크린샷 2024-06-11 오후 8.46.39.png







1
String[] menus = new String[]{"1", "2", "3"}; // menus 레퍼런스의 배열...

스트링 리터럴은 그냥 빈곳에 아무데나 생성함 nextLine은 같은 단어라도 새로운 레퍼런스를 생성함

메서드

  • 명령문 묶음
  • UML(Unified Modeling Language)을 사용해서 코드를 글과 그림으로 표현
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.