⚙️ backend/☕️ java

Day02. 자바 프로그래밍 기본

dev!n 2023. 7. 7. 08:54

tip💡 mac의 finder에서 숨김 폴더 보기 command+shift+.

자바 기본 문법

Method

작성 방법

/* syntax */
modefiers returnType methodName(parameters) {
	[return 가지고 나갈 값;] // [생략 가능]
}
  1. modefiers(0개 이상) 제한자
    1. access modefier 접근 제한자
      • public 어디서나 아무나
      • protected 폴더가 달라도 상속관계면 어디서나
      • ( ) 같은 패키지라면 아무나
      • private 하나의 객체 안에서만. 이걸 붙여주면 은닉=캡슐화
    2. 기타 제한자
      • static 객체 생성 없이 접근
      • final 상속, 오버라이딩 금지
      • abstract
      • syncronized
      • default
  2. returnType 반환 데이터타입
    • void 리턴 값이 없다
    • primitive type ex) int, double, char
    • object type ex) String, 사용자 정의 클래스 데이터타입
    • 리턴할 게 많다면 Array, Collections
  3. methodName
    • 이름 규칙 camelCase
  4. parameter 매개변수
    • datatype variableName

호출 방법

순서대로 확인

  1. static method
    1. ClassName.method([인수, ...]);
    2. ex) int i = Integer.parseInt(stringVarible);
    • 레퍼런스 변수로 접근할 필요가 없다 cf) 2. 일반적
    • 싱글톤 패턴에서 중요하게 쓰임
    • 사용 여부와 상관 없이 메모리에 적재되므로 무분별하게 사용하면 메모리 낭비
    • static 안에서 non static에 접근할 수 없음. this 쓸 수 없음. 메모리 공간이 다름.
    // java.lang
    public final class Math {
    	public static double random() {
    		// 랜덤 숫자 반환
    	}
    }
    
    public final class Integer {
    	public static int parseInt(String s) {
    		// 정수 반환
    	}
    
    	public static String toString(int i) {
    		// 문자열 반환
    	}
    }
    
  2. 같은 클래스 내부 method
    1. this.methodName([인수, ...]);
    2. this ←→ super
      • 나 ←→ 부모
      • this.fieldName, this.methodName, this(값, ...) 생성자 구현부 첫번째 줄에서만 사용 가능
      • super.fieldName, super.methodName, super(값, ...)
  3. 일반적
    1. 호출하려는 method를 감싸고 있는 class 생성(new)
      1. ClassName classVariable = new ClassName([생성자 전달값]);
    2. 생성된 객체 변수를 이용하여 method를 호출
      1. classVariable.methodName([인수, ...]);
    • 멤버 변수만을 필드(속성)라고 한다 지역 변수는 그냥 변수
    • 자바의 시작과 끝 main method
      • public void main을 찾아서 거기서부터 시작됨.
      • stack에 쌓임.

Java file

한 파일 안에

  1. 여러 개의 class 작성 가능
  2. public class는 하나만 작성 가능
  3. public class는 반드시 파일명과 같아야 한다!
  4. public class 안에 main method 작성
    1. 시작하려면 main method가 반드시 필요
    2. 시작하려는 class의 이름으로 파일명을 지정하고 그 class 안에 main method 작성
  5. modefier는 public or (default)
  • 모든 Java 객체는 Object를 상속 받는다

연산자

+ 산술 연산 또는 문자열 결합

5 + 2 -> 5(int)
"5" + 2 -> 52(String)
"2" + 5 -> 25(String)
"5" + "2" -> 52(String)

'5' + 2 -> 55(int)
'A' + 2 -> 67(int)

/* 연산하려면 최소한 4bytes의 공간이 필요하다 */
byte a=3, b=2; // -128~127
int c = a+b;
byte d = (byte)a+b;

+cf) 연산자 우선순위

Static

Class

클래스 앞에 static 불가. 단 inner class에는 가능.

class A { // outer
	static class B { // inner
		// class 관계 is Class, has Class 서로 자원을 전달하는 패턴을 만들어야 한다
		// 자원 전달이 불편할 때 outer class의 모든 field(전역변수), method에 접근할 수 있다
		
		// 자바는 객체지향(재사용)이 목적인데 이렇게 만들면 
		// 독립적으로 쓸 수 없다는 단점
	}
}

cf) event(android)

Variable

지역변수

  • method 내부
  • 선언된 영역(method) 내에서만
  • 제한자 불가
  • 사용 전 반드시 초기화

전역변수 field

  • class 내부
  • 모든 method에서 접근 가능
  • 제한자 가능
    • 객체 생성 안하고 객체 이름으로 접근 가능
    • 같은 class들이 공유하는 공유 변수
    • spring
      • DI 개념에 의해 모든 객체를 싱글톤으로 만든다. 사전 초기화.
      • 기본인 만큼 많이 쓰인다.
      • 메모리 관리 이점.
  • 지역변수와 이름이 같을 때 구분 this.전역변수
  • 생성 시점에 자동 초기화
    • 0에 준하는 값으로 초기화됨
    • int ⇒ 0 | double ⇒ 0.0 | char ⇒ ₩u0000 | boolean ⇒ false | String ⇒ null

Method

  • 객체 생성 없이 ClassName.methodName([paramater, ...]);
  • static method 안에서
    • non-static method 호출 불가
    • this 키워드 사용 안됨

Block

  • 배포 시 사전 작업
    • db 연결, 서버 작동, 사전 초기화 등 일련의 setting
    • 문제가 생기면 프로그램을 실행하지 않도록
static {
		System.out.println("static 먼저");
}

입력

Java 5.0 이후로 Scanner 제공

방대한 양의 데이터를 읽어낼 때 현저한 속도 차 ⇒ iostream 사용

반복문이 1억번 돌면 대략 1초

java.util.Scanner

Scanner sc = new Scanner(System.in);
sc.nextInt(); 
sc.next(); 
sc.nextLine();

다 지원해줘서 쉽다. 하지만 속도가 스트림을 이용하는 것보다 현저히 느림.

java.io.BufferedReader

InputStream → Reader → Buffered 가공. 다형성, 상속 관계일 때

  1. byte 단위
    1. InputStream
    2. OutputStream
    file 전송, 동영상,보조, filter stream 있음
  2. Inputstream ——> new InputStreamReader(InputStream is);
  3. 문자단위로 변환 필요
  4. 문자 단위
    1. Reader
    2. Writer
    채팅,속도를 위해 권장
  5. InputStreamReader ——> new BufferedReader(new InputStreamReader(System.in))
  6. 한글처리 2byte

참고 링크

http://www.tcpschool.com/java/java_api_string

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Scanner.html

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/BufferedReader.html