Java 기초 #1

Nak Jun Choi·2022년 10월 31일

Java 기초

자바의 특징

  • 운영체제에 독립적 : JRE(Java Runtime Enviroment : JVM(자바 가상머신) + 표준 라이브러리)가 설치되어 있는 모든 운영체제에서 실행이 가능하도록 만들었다.

  • 객체 지향 언어(Ojbect Oriented Programming, OOP) : 여러 부품(객체)들을 만들고 조립하여 하나의 프로그램을 실행하는 개념. 유지보수가 쉽고 확장성이 높다.

  • 함수형 프로그래밍 지원 : 자바 8버전부터 함수형 프로그래밍을 지원하는 문법인 람다식과 스트림이 추가되었다. 이를 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하기 위워지고 코드가 간결해진다.

  • 자동 메모리 관리(Garbage Collection) : 자바는 Garbagea Collectier를 실행시켜 자동으로 사용하지 않는 메모리를 수거한다.

JVM 과 JDK

  • 자바는 컴파일러(Compiler)를 통해 기계어로 변환되는 언어이다. 자바 언어를 JVM이 이해할 수 있는 바이트 코드로 변환하는 것을 의미한다.

  • JVM(Java Virtual Machine) : 자바 프로그램을 실행시키는 도구이다. 자바가 운영체제에 독립적인 것은 JVM이 있기 때문에 가능하다. 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램이다. 즉, 프로그램을 실행하는 프로그램이다.

  • JVM의 경우 JDK나 JRE를 설치하면 자동으로 설치된다.

  • JDK(Java Development Kit)

    • JRE(Java Runtime Enviroment) : JVM + 표준 클래스 라이브 러리
    • JDK(Java Development Kit) : JRE + 개발에 필요한 도구

Hello World.

  • 메서드 정의

    public static void main(String[] args){
    
    }
    • void : 반환 타입
    • public : 접근 제어자
    • static : 정적
    • main : 메소드 이름
    • String[] : 매개변수 타입
    • args : 매개변수
  • Main method : 프로그램이 실행될 때 가장 먼서 실행되는 진입점 함수라고 부른다.

의사 코드

  • 의사 코드 슈도코드(Pseudo Code) : 프로그래밍 언어로 작성하기 전에, 무엇을 어떤 과정을 통해 만들지 사람의 언어로 먼저 작성하는 것이다.

  • 나중에 대형 프로젝트를 위해서 소규모 프로젝트로 미리 연습해두기. 코드 짤때 오류를 줄이고 방향성을 알게 해준다.

변수

  • 변수(Variable) 이란?
    • 값이 변할 수 있는 데이터를 임시적으로 저장하기 위한 수단
    • 값을 저장할 수 있는 메모리 공간을 확보하고, 사람이 식별할 수 있는 이름을 붙인 것
  • 변수 선언과 값 할당
class Example {
	public static void main(String[] args) {
		int num; // 변수 선언
		num = 1; // 값 할당
	}
}
  • 변수 명명 규칙 : 카멜 케이스(camelCase) : 두 번째 단어부터 대문자로 시작해 구분한다.

상수

  • 상수(Constant)란?
    • 변하지 말아야 할 데이터를 임시적으로 저장하기 위한 수단
    • final 이라는 키워드를 사용해 선언할 수 있다.
    • 관례적으로 대문자에 언더바(_)를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용한다.
  • 상수를 사용하는 이유
    • 프로그램이 실행되면서 값이 변하면 안되는 경우
    • 코드 가독성을 높이고 싶은 경우
    • 코드 유지관리를 손쉽게 하고자하는 경우

타입

  • 타입이란? : 타입은 어떤 값의 유형 및 종류를 의미하며, 타입에 따라 값이 차지하는 메모리 공간의 크기와, 값이 저장되는 방식이 결정된다.

  • 기본 타입과 참조 타입

    • 기본 타입 (Primitive type)
      • 값을 저장할 때, 데이터의 실제 값이 저장된다.
      • 정수 타입, 실수 타입, 문자 타입, 논리 타입
      • 값 그자체가 변수에 저장되기 때문에 출력의 결과는 저장하고 있는 값이 출력된다.
    • 참조 타입 (Reference type)
      • 값을 저장할 때, 데이터가 저장된 곳을 나타내는 주소값
      • 객체의 주소를 저장, 8개의 기본형을 제외한 나머지 타입
      • 객체의 주소값이 출력된다.

리터럴

  • 리터럴(Literal)이란? : 프로그래밍에서 리터럴이란 문자가 가르키는 값 그자체를 뜻한다.

  • class Example {
    	public static void main(String[] args) {
    		int num; // 변수 선언
    		num = 1; // 값 할당 , 1이 리터럴이다.
    	}
    }```

정수 타입

  • 정수 타입은 숫자를 나타내느 타입으로, byte, short, int, long 총 4개의 타입으로 분류된다. 이들은 각각 차지하는 메모리의 크기가 다르며 그에 따라 나타낼 수 있는 숫자의 범위가 다르다.
// 각 데이터 타입의 표현 범위에 맞는 값을 할당하고 있다. 
byte  byteNum  = 123;
short shortNum = 12345;
int   intNum   = 123456789;
long  longNum  = 12345678910L;

// 각 데이터 타입의 표현 범위에 벗어난 값을 할당하고 있어 에러가 발생한다. 
byte  byteNum  = 130;
short shortNum = 123456;
int   intNum   = 12345678910;

// 숫자가 길면 언더바로 구분할 수 있다. 
int   intNum   = 12_345_678_910;
long  longNum  = 12_345_678_910L;```
  • long 타입 리터럴의 경우에는 리터럴 뒤에 접미사 L을 붙여주어야 한다.
  • 정수형의 오버플로우와 언더플로우 : 각 타입의 표현 범위를 넘어서는 경우, 최대 값을 넘어서면 오버플로우 최소 값을 넘어서면 언더플로우라 말한다.

실수 타입

  • float형과 double 형으로 분류된다.
  • float형 리터럴에는 반드시 접미사 f를 붙여주어야 한다.
  • double형은 float형보다 정밀도가 더 높다.

논리 타입

  • ture 혹은 false를 값으로 가진다.

문자 타입

  • 오직 하나의 문자형 이터럴을 저장할 수 있다.
  • 작은 따옴표 '''를 사용해야 한다.
  • 자바는 유니코드로 문자를 저장한다. 따라서 문자형 리터럴을 문자형 변수에 할당하면 변수에 문자 리터럴의 유니코드 숫자값이 저장된다.

타입 변환

  • 자동 타입 변환
    • 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때
    • 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때
  • 수동 타입 변환
    • 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장하기 위해서는 수동으로 타입을 변환해주어야만 한다. 이를 캐스팅(Casting)이라 한다.

String 타입의 변수 선언과 할당

  • String 타입의 변수는 String 변수명; 으로 선언할 수 있다.

  • 선언한 변수에 문자열을 할당하는 두 가지 방법

    • 문자열 리터럴을 할당하는 방법 : 변수 = "문자열";
    • String 클래스의 인스턴스를 생성하여 할당하는 방법: 변수 = new String("문자열");
  • 실제 문자열의 내용을 값으로 가지고 있는 것이 아니라, 문자열이 존재하는 메모리 공간 상의 주소값을 지정하고 있다.

  • 동일한 문자열 리터럴을 두 변수에 할당하는 경우, 두 변수는 같은 문자열의 참조값을 공유한다.

ex).
String name1 = "kim Coding";
String name2 = "kim Coding";
 
  • String 클래스의 인스턴스를 생성하게 되면 문자열 내용이 같을지라도, 별개의 인스턴스가 따로 생성된다.
ex).
String name3 = new String("Kim Coding");
String name4 = new String("Kim Coding"); 

String 클래스의 메서드

  • charAt() 메서드 : 해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다.

  • compareTo() 메서드 : 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교한다. 대소문자를 구분하여 비교한다. 만약 두 문자열이 같다면 0을 반환하며, 해당 문자열이 인수로 전달된 문자열보다 작으면 음수를 크면 양수를 반환한다. 만약 문자열을 비교할 때 대소문자를 구분하지 않기를 원한다면, compareToIngnoreCase() 메소드를 사용하면 된다.

  • concat() 메서드 : 해당 문자열의 뒤에 인수로 전달된 문자열으 추가한 새로운 문자열을 반환한다. (두 문자열을 연결한다.)

  • indexOf() 메서드 : 해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다.

  • trim() 메서드 : 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거한다.

  • toLowerCase()와 toUpperCase() 메서드 : 모든 문자를 소문자 그리고 대문자로 변환시켜 줍니다.

  • https://www.javatpoint.com/understanding-toString()-method 자바 문자열 조작 메서드를 설명하고 있는 레퍼런스

StringTokenizer

  • StringTokenizer 이란? : 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스이다. 그렇게 쪼개어진 문자열을 토큰(Token)이라고 부른다. 사용하기 위해서는 java.util.StringTokenizer를 import해야한다.

  • int countToken() : 남아있는 token의 개수를 반환한다. 전체 token의 개수가 아닌 현재 남아있는 token 개수이다.

  • boolean hasMoreElements(), boolean hasMoreTokens() : 현재 위치 뒤에 있는 문자열에서 하나 이상의 토큰을 사용할 수 있는 경우 true를 반환하고 그렇지 않으면 false를 반환한다.

  • Object nextElement(), String nextToken() : 다음의 토큰을 반환한다. 두 메서드는 같은 객체를 반환하지만, nextElements는 Object를 nextToken은 String을 반환한다.

  • StringTokenizer tokenizer = new SringTokenizer(str, "구분자 종류"); 구분자 종류를 여러개 선택 가능하고 추가한 구분자대로 문자열을 쪼개준다.

StringBuilder / StringBuffer

StringBuilder : 여러 개의 문자열을 더할 때 새로운 인스턴스 생성없이 더하는 작업을 가능하게 함.

public class Main {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("문자열 ").append("연결");
        String str = stringBuilder.toString();
        System.out.println(stringBuilder);
        System.out.println(str);
    }
}
  • StirngBuilder의 객체를 생성한 후, append()의 인자로 연결하고자 하는 문자열을 넣어서 StringBuilder의 객체를 통해 호출한다.
  • 문자열을 출력할 때, 그리고 변수에 문자열을 할당할 때에는 toString() 메서드를 사용하면 된다.

StringBuffer : StringBuffer 클래스의 인스턴스는 String 클래스의 인스턴스와 달리 그 값을 변경할 수 있고 추가할 수 있다.

  • append() : 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 마지막에 추가한다.
    ex) StringBuffer str = new StringBuffer("Java");
  • capacity() : StringBuffer 인스턴스의 현재 버퍼 크기를 반환한다.
    ex) StringBuffer str02 = new StringBuffer("Java");
  • delete() : 전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거한다. 첫 번째 매개변수로 전달된 인덱스부터 두 번째 매개변수로 전달된 인덱스 바로 앞의 문자까지를 삭제하는 메서드이다.
StringBuffer str = new StringBuffer("Java Oracle");
System.out.println("문자열 : " + str);
System.out.println(str.delete(4, 8));
System.out.println(str.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + str);
  • insert() : 인수로 전달된 값을 문자열로 변환한 후, 해당 문자열의 지정된 인덱스 위치에 추가한다.
StringBuffer str = new StringBuffer("Java Programming!!");
System.out.println("문자열 : " + str);
System.out.println(str.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + str);

산술 연산자

  • 증감 연산자
int num1 = 1;
int prefix = ++num1; // num 의 값이 1만큼 증가된다음 결과값이 prefix에 할당된다.

int num2 = 1;
int postfix = num2++; // postfix에 num2 값이 먼저 할당되고 num2의 값이 1 증가한다.
  • 복합 대입 연산자
if) num1 ~ 5의 값들이 10일 경우

num1 += 3; // num1 -> 13
num2 -= 3; // num2 -> 7
num3 *= 3; // num3 -> 30
num4 /= 3; // num4 -> 3
num5 %= 3; // num5 -> 1

비교 연산자

  • 대소 비교 연산자
5 > 3	true
5 <= 5	true
3 > 2	true
2 >= 3	false
  • 등가 비교 연산자
5 == 3	false
5 == 5	true
3 != 2	true
3 != 3	false

논리 연산자

  • 논리 연산자란? : AND 연산자 &&, OR 연산자 ||, NOT 연산자 !를 포함하며, 공통적으로 boolean 타입을 반환합니다.
    • AND 연산자 : 피연산자가 두 개가 모두 true일 때 true를 반환하며, 피연산자 두 개중 하나라도 true가 아니면 false를 반환한다.
    • OR 연산자 : 피연사 두 개 중 단 하나라도 true면 true를 반환하며, 피연산자가 모두 false인 경우에만 false를 반환한다.
  •   x      y	    x && y   x || y
    false	false	false	 false
    false	true	false	 true
    true	false	false	 true
    true	true	true	 true

연산자 우선순위

  •   우선순위	      연산자	              내용
         1	        (),[]	           괄호 / 대괄호
         2		 !, ~, ++, --	      부정/ 증감 연산자
         3		    *, /, %	         곱셈 / 나눗셈 연산자
         4		  <, <=, >, >=	      대소 비교 연산자
         5		     &&	AND 			  연산자
         6		     ||	OR 			      연산자
         7		       ? :				조건 연산자
         8		 =, +=, -=, /=, %=	  대입/할당 연산자```
  • 조건 연산자 : 세 개의 피연산자를 필요로 하는 삼항 연산자이다.
ex. ( 조건식 && 조건식 ) ? A : B
앞에 ()안이 true이면 A를 출력하고 false이면 B를 출력한다.

String Format

  • public static void main(String[] args) {  
            String str1 = String.format("%d", 101);          // Integer value  
            String str2 = String.format("%s", "Amar Singh"); // String value  
            String str3 = String.format("%f", 101.00);       // Float value  
            String str4 = String.format("%x", 101);          // Hexadecimal value  
            String str5 = String.format("%c", 'c');          // Char value  
            System.out.println(str1);  
            System.out.println(str2);  
            System.out.println(str3);  
            System.out.println(str4);  
            System.out.println(str5);  
        }  
      
      Result
      101
      Amar Singh
      101.000000
      65
      c

콘솔 입력

  • import java.util.Scanner;                 // Scanner 클래스를 가져옵니다.
     Scanner scanner = new Scanner(System.in); // Scanner 클래스의 인스턴스를 생성합니다.
     String inputValue = scanner.nextLine();   // 입력한 내용이 inputValue에 저장됩니다.
     System.out.println(inputValue);           // 입력한 문자열이 출력됩니다.```
    
  • 참고로, scanner에는 문자열을 입력받는 nextLine()뿐만 아니라, 정수형을 입력받을 수 있는 nextInt(), 실수형을 입력받을 수 있는 nextFloat()등의 메서드들도 존재한다.

profile
HelloWorld

0개의 댓글