[LG CNS AM CAMP 1기] 백엔드 I 1 | Java

letthem·2025년 1월 9일
0

LG CNS AM CAMP 1기

목록 보기
11/16
post-thumbnail

Do it 자바 완전 정복 동영상 강의

클래스: 어떤 데이터와 그 데이터를 조작하는 함수를 묶어놓은 것 (데이터가 잘못 변형되는 것을 막는다)

자바: 대표적인 객체 지향 언어

JDK, JRE

  • JDK: Java Development Kit (자바개발도구)
  • JRE: Java Runtime Environment (자바 실행환경)
.java 파일을 컴파일하면 --> .class -------> JVM(가상머신)으로 실행
          JDK(javac)          JRE(java)

설치

IDE : 통합개발환경

나는 java 17과 intelliJ를 설치해주었다

intelliJ 예쁘게 꾸미기 ㅎ.ㅎ

프로젝트 생성 > 자바 > Test 라는 이름으로 프로젝트 생성

intelliJ 단축키

이건 예전에 대 김영한 님 강의 들을 때 내가 정리해뒀던 거다 !

  • RUN : control + R
  • 파라미터 정보 : “파라미터”에 command + P
  • ( 괄호 닫고 ; ← 이와같이 좀 귀찮은 거 자동완성 : ( → command + shift + enter
  • control + enter → 생성자 !!! Generate / Getter and Setter
  • 빨간 줄 ex) 섹션3-2 implements MemberRepository할 때 option + enter 해서 모두 ok하면 모두 override 할 수 있음
  • import 필요할 때 : ctrl + space / option + enter
  • shift + fn + F6 → rename 중복되는 이름 변경 편하게 하고 싶을 때!!
  • command + option + V → return 그냥 해줌
    • memberRepository.findByName(member.getName());
      Optional<Member> result = memberRepository.findByName(member.getName());
  • Ctrl + T → 리팩토링 관련 - inline하면 return 합쳐줌
  • command + option + M : method로 뽑기
  • 클래스에서 command + shift + T : 테스트 껍데기 자동 생성
  • Ctrl + R → 이전에 실행했던 거 다시 실행
  • command + E : 과거 내역
  • option + Enter : 해당 기능(클래스)이 포함된 패키지를 자동으로

자바 특징

플랫폼 종속


이렇게 mac에서 만들어지면 mac에서만 실행 가능한 것을 플랫폼 종속적이라고 한다.

플랫폼 독립

JVM : Java Virtual Machine

운영체제 별로 JVM만 설치되어 있으면 mac에서 만든 애플리케이션을 window, mac, linux 에서 실행 가능하다 !

자바가 인기를 누린 계기 😏

호환이 안 되는 경우도 있다 (32bit != 64bit) -> 함께 묶어서 배포하는 컨테이너 가상화 기술로 해결

자바 프로젝트 생성 및 실행

main 함수가 있는 곳에서 실행 !!!!

package

논리적인 directory 개념으로 묶어주는 것
src 밑에 mypack 으로 package를 만들어준다.

class

package 안에 Test 로 class를 만들어준다.

package mypack;
~~~~~~~~~~~~~~
패키지 이름

public class Test {
~~~~~~       ~~~~
|            클래스 이름 = java 파일명
+-- 접근 지정자(제한자, modifier)

	public static void main(String[] args) {	⇐ 해당 클래스를 실행할 때 처음으로 호출되는 메서드
	                      main 메서드를 가지고 있는 클래스 ⇒ 실행 클래스
						  main 메서드를 가지고 있지 않은 클래스 ⇒ 라이브러리 클래스
		System.out.println("Hello, Java!!!");	⇐ 문자열을 콘솔에 출력
	}
}
  • public 클래스 내부에서 접근할 수 있다
  • void 함수 리턴 결과가 없다
  • static 정적 변수

sout만 쳐도 System.out.println();가 나온다 !

mypack.Test <- 패키지 명에 포함된 .은 디렉토리로 구분
=> 패키지는 자바 파일을 구분하는 수단으로 사용
=> 패키지 이름을 유일하게 만드는 방법이 필요
=> 도메인 이름의 역순으로 표기
ex) naver.com => com.naver.MyTest
daum.com => com.daum.MyTest

주석 (comment)

package mypack;
/**
 * 문서화 주석
 *
 * @author 홍길동
 */
public class Test {
    /**
     * main 메서드
     * @param args 실행 시 전달되는 매개변수를 배열 형태로 전달
     */
    public static void main(String[] args) {
        // 인라인 주석 (command + /)

        /*
            주석 기호 내의 모든 내용을 해석하지 않음 (command + shift + /)
         */
        System.out.println("Hello, Java!!!");
    }
}

클래스 이름과 자바 파일 간의 관계

파일명과 클래스 명이 같아야만 public을 붙일 수 있다.

package com.test;

// Java 파일명과 동일한 클래스에만 public 접근 지정자를 붙일 수 있음
public class MyTest { // MyTest.class
}

class A { // A.class

}

class B { // B.class
    class C { // B$C.class <= 내부 클래스

    }
}

println() 메서드

package com.test;

// Java 파일명과 동일한 클래스에만 public 접근 지정자를 붙일 수 있음
public class MyTest { // MyTest.class
    public static void main(String[] args) {
        // System.out.println() => 인자값을 콘솔에 출력하고 개행문자를 처리
        System.out.println(); // 한 줄 띄우기
        System.out.println("문자열");
        System.out.println(1234);
        System.out.println(true);
        System.out.println();
    }
}

package com.test;

// Java 파일명과 동일한 클래스에만 public 접근 지정자를 붙일 수 있음
public class MyTest { // MyTest.class
    public static void main(String[] args) {
        // System.out.println() => 인자값을 콘솔에 출력하고 개행문자를 처리
        System.out.println(); // 한 줄 띄우기
        System.out.println("문자열");
        System.out.println(1234);
        System.out.println(true);

        // System.out.print(); => 인자값을 콘솔에 출력
        System.out.print("문자열");
        System.out.print(1234);
        System.out.print(true);

        // 개행문자를 출력
        System.out.print("개행문자를 포함\n");
        System.out.print("다음 줄에 출력\n");

        // System.out.printf() => 형식 문자열을 이용해서 출력
        //                        ~~~~~~~~
        //             데이터의 출력 형식을 지정하는 %로 시작하는 문자열
        System.out.printf("%s 문자열 출력\n", "이것은 문자열입니다.");
        System.out.printf("%d 숫자 출력\n", 1234);
        System.out.printf("%d : %f : %4.2f\n", 100, 15.66666, 15.66666);
    }
}
![](https://velog.velcdn.com/images/letthem/post/e9f0bad8-4310-459a-a596-8e6e3c8d9aa4/image.png)

메서드 오버로딩(method overloading)

같은 이름의 메서드를 매개 변수의 타입, 개수, 순서를 다르게 해서 여러 개 정의 (반환 타입은 포함되지 않음)
자바의 다형성(polymorphism) 개념의 구현

cf) 오버로딩 VS 오버라이딩

  • 오버로딩(Overloading)은 기존에 없던 새로운 메서드를 정의하는 것
  • 오버라이딩(Overriding)은 상속받은 메서드의 내용만 변경하는 것

엄격한 Data Type 적용 (JavaScript와 차이)

package com.test;

// Java 파일명과 동일한 클래스에만 public 접근 지정자를 붙일 수 있음
public class MyTest { // MyTest.class
    public static void main(String[] args) {
        // 변수 선언 시 변수가 가지는 데이터 타입을 지정
        int a;

        a = 123;
        a = 123.0; // error: double을 int로 바꿀 수 없다
        a = "abc"; // error: string을 int로 바꿀 수 없다
    }
}

변수 이름 규칙 = 상수 이름과 메서드 이름 규칙에도 동일

  • 영문 대소문자 및 한글 사용이 가능
  • 특수문자는 두 가지만 사용이 가능 => _ $
  • 숫자 사용이 가능하나, 첫 번째로는 올 수 없음
  • 자바에서 사용 중인 키워드는 사용할 수 없음

변수, 메서드 이름 권고 사항

  • 변수 이름은 소문자로 시작
  • 두 개 이상의 단어가 결합되는 경우, 새 단어는 대문자로 시작 => 카멜 표현식

상수 이름 권고 사항

  • 상수 이름의 모든 문자를 대문자로 표기 ex) PI
  • 두 개 이상의 단어가 결합된 경우, _로 연결 => ex) MY_DATA
package com.test;

public class MyTest {
    public static void main(String[] args) {
        // 변수 명명법
        boolean aBcD;  // O 가능하지만 권고 위배
        byte 가나다; // O
        short _abcd; // O
        char $ab_cd; // O
        int 3abcd; // X 숫자로 시작
        long abcd3; // O
        float int; // X 예약어를 사용
        double main; // O
        int my Work; // X 공백을 포함
        String myClassName; // O camel 표기법
        int ABC; // O 가능하지만 권고 위배 (상수 표기법)

        // 상수 명명법
        final double PI; // O
        final int MY_DATA; // O
        final float myData; // O 가능하지만 권고 위배 (변수 표기법)
        
    }
}

변수의 생존기간(scope)

변수는 선언된 시점에 생성되고, 생성된 변수는 자신이 선언된 열린 중괄호의 쌍인 닫힌 중괄호를 만나면 메모리에서 삭제

package com.test;

public class MyTest {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("#1 : " + a); // 10

        {
            int b = 20;
            System.out.println("#2 : " + a); // 10
            System.out.println("#3 : " + b); // 20
        }

        {
            int b = 30;
            System.out.println("#4 : " + a); // 10
            System.out.println("#5 : " + b); // 30
        }

        System.out.println("#6 : " + a); // 10
        System.out.println("#7 : " + b); // error
    }
}

자료형 (Data Type)

기본 자료형(primitive) => 값이 스택에 저장 => 크기가 고정

일반적으로 소문자로 시작

  • boolean : true, false
  • 정수 : byte(1), short(2), int(4), long(8)
  • 실수 : float(4), double(8)
  • 문자 : char(2)

참조 자료형(reference) => 실제 값은 힙에 저장되고, 스택에는 그 주소가 저장 => 크기가 가변

일반적으로 대문자로 시작
모든 참조 자료형은 클래스로 되어있기 때문 !

  • 문자열, 배열, 클래스, 인터페이스, ...

JVM 메모리 구조


기본 자료형


  • long : L을 붙여 형변환
  • float: F를 붙여 형변환

자바에서는

  • "" : 문자열(string)
  • '' : 문자(char)

문자의 유니코드 검색

package com.test;

public class MyTest {
    public static void main(String[] args) {
       char heart = '\u2665';
        System.out.println(heart);
    }
}

기본 자료형 간 타입 변환 ⭐️⭐️⭐️⭐️⭐️

package com.test;

public class MyTest {
    public static void main(String[] args) {
        char heart = '\u2665';
        int i = 100;

        byte b = 127; // 127까지 가능
        float f = 100.0F;

        System.out.println(heart);
    }
}

byte short int long float double char 타입 변환 가능하다.

  • float: 소수는 double로 자동 저장돼서 error 발생. F를 붙여 수동으로 형변환 해줘야 한다.

타입 변환 방법

자동 타입 변환 & 수동 타입 변환

ex) byte c = (byte)128 // -128

0000 0000 0000 0000 0000 0000 1000 0000
~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~
                            의도하지 않게 부호값(-)로 나옴

기본 자료형 간의 연산

연산자

쇼트 서킷(short circuit)

연산을 수행하는 과정에서 결과가 이미 확정되었을 때 나머지 연산 과정을 생략

package com.test;

public class MyTest {
    public static void main(String[] args) {
        // | 연산 => 모든 연산을 수행 후 결과를 비교
        /*
        // java.lang.NullPointerException 예외가 발생
        String s = null;

        if (5 > 3 | s.equals("abc")) {
            System.out.println("^^;;;");
        }
        */

        // || 연산 => 결과가 확정되면 연산을 생략하므로 예외가 발생하지 않음
        String s = null;

        if (5 > 3 || s.equals("abc")) {
            System.out.println("^^;;;");
        }
    }
}

if (5 > 3 | s.equals("abc"))
앞 연산 true, 뒤 연산 에러나는 상황

  • | 연산 => 모든 연산을 수행 후 결과를 비교하기 때문에 뒤 연산을 생략하지 않는다.
    s가 null 이라서 s.equals 로 참조가 불가해서 에러가 난다.

  • || 연산 => 결과가 확정되면 뒤 연산을 생략하므로 에러가 나지 않는다.

대입 연산자 축약 표현


제어문과 제어 키워드

  • 선택 제어문 : if, switch
  • 반복 제어문 : for, while, do-while
  • 제어 키워드 : break, continue

if

switch

package com.test;

import java.util.Scanner;

public class MyTest {
    public static void main(String[] args) {
       // option + enter => 해당 기능(클래스)이 포함된 패키지를 자동으로 
        Scanner scanner = new Scanner(System.in);
        
        int score = scanner.nextInt();
        switch(score) {
            case 10:
                System.out.println("A등급");
                break;
            case 20:
                System.out.println("B등급");
                break;
            case 30:
                System.out.println("C등급");
                break;
            default:
                System.out.println("기타 등급");
                break;
        }
    }
}

for

while

do-while

break

continue

반복문의 다음 조건으로 이동

0개의 댓글