캐시에 대해서 검색을 하다가.. 캐시가 어디에 저장되는 것이 문득 궁금해졌다.

캐시는 JVM Heap 메모리에 저장할 수 있다고 한다.

 

JVM Heap 메모리는 무엇일까?

JVM이 구동되면 JVM은 운영체제에서 할당받은 메모리영역을 메소드영역, 힙 영역, 스택영역으로 구분해서 사용한다고 한다.

 

메소드영역은 

'바이트코드 파일을 읽은 내용이 저장되는 영역'이며 클래스 정보, static 변수, final 상수 등이 저장된다고 한다.

여기서 바이트코드 파일은 소스파일(.java)을 작성한 후에 컴파일하면 나오는 확장자 명이 .class인 바이트코드 파일가 생성된다.

애플리케이션 실행시, 클래스 최초 사용시 (클래스가 처음 로딩될 때) 저장되며, 대부분의 경우는 애플리케이션 종료시까지 계속 유지된다.

Java 8이후로 Metaspace라는 것을 사용, OS 메모리를 사용하여 동적으로 증가가능하다고 한다. 

정적변수나 상수 값에 접근시 매우 빠르게 접근 할 수 있지만 동적으로 생성된 클래스가 많을 경우 Metaspace OOM(out of memory)이 가능하다고 한다.

 

힙 영역은 객체, 배열이 저장되는 영역이다.

자바 애플리케이션에서 new 키워드로 생성되는 모든 객체(List, Map, DTO, Service)들은 힙 영역에 저장된다.

new ArrayList<>(), newHashMap<>(), new DTO()... 등등

new 키워드로 객체가 생성될 때 동적으로 힙에 저장되고, 해당 객체에 참조가 사라지면 GC(Garbage Collector)가 제거한다.

그리고 메모리의 대부분을 차지한다고 한다.

힙 영역은 대규모 데이터 저장이 가능하지만 객체가 많아지면 GC가 너무 자주 제거업무를 해야해서 CPU사용율이 급증하여 성능이 저하되고, 메모리 누수시에는 OutofMemoryError가 발생할 수 있다. 

 

스택 영역

지역변수, 메서드를 호출할 때마다 생성되는 프레임, 지역변수(int, double 등), 매개변수(전달되는 값)이 저장되는 영역으로, 임시적으로 사용하는 공간이다.

메서드가 호출될 때 스택 프레임이 생성되고, 메서드 내부에서 선언한 지역변수는 이때 저장된다.

메서드 실행이 종료되면 해당 스택 프레임은 제거(pop)된다.

각 쓰레드마다 개별 스택을 가지며, 너무 깊은 재귀나 대량의 지역변수일 경우에는 StackOverflowError가 발생한다고 한다.

그러고 보니 StackOverflowError는 몇 번 마주친 적이 있었다.

스택 영역은 LIFO 구조로 빠른 할당, 해제를 통해 성능이 매우 좋으나 위에 말한대로 스택오버플로우 위험가능성이 있다. (무한재귀, 깊은 함수 호출시)

 

재미있는 것은 List<String> AList = new ArrayList<String>(); 이렇게 선언했다고 하면,

AList라고 하는 참조변수는 스택에 저장되고,

newArrayList<String>()은 힙에 저장된다. 

 

세 영역 비교 요약표

 

영역 저장대상 생명주기 크기/유동성 서버에 미치는 영향
메소드(Method) 클래스 정보, static 앱 실행~종료 JVM or OS 메모리 클래스 수 많을 시 OOM 가능
스택(Stack) 지역 변수, 호출 정보 메서드 실행 시 작음 (1MB ~ 2MB) 깊은 재귀시 StackOverflow
힙(Heap) new 객체, 배열 참조 유지 시 가장 큼 (수백 MB~수 GB) GC 비용 높음, OOM 발생 가능

신기한 자바와 스프링의 세계.

 

OOM을 방지하기 위해서는 static 선언을 자제하고, 더 이상 사용하지 않는 객체는 연결을 끊어주는 것이 좋다고 한다.

static List<String> hugeList = new ArrayList<>();

public void loadData() {
    for (int i = 0; i < 1000000; i++) {
        hugeList.add("data" + i);
    }

    // 작업 끝났으면 리스트 초기화
    hugeList = null;
}

위와 같이 리스트 사용이 끝나면 null선언 해서 참조를 끊어주면, 가비지 콜렉터가 객체를 수거한다.

 

public void loadData() {
    List<String> hugeList = new ArrayList<>();

    for (int i = 0; i < 1000000; i++) {
        hugeList.add("data" + i);
    }

    // 지역 변수이므로 메서드 종료와 함께 GC 대상이 됨
}

혹은 static 대신 지역변수로만 선언하기! 가장 안전하고 메모리 누수를 원천적으로 막는 방법이라고 한다.

 

그리고 리스트가 커야하면 BufferedWriter 같은 스트림을 써서 바로 디스크에 기록하는 것이라고 하는데...

또다시 BufferedWriter를 마주쳤다! BufferedReader, Writer에 대해서도 공부해보아야겠다.

 

https://blog.naver.com/oshares/223621286335

 

Cerule has granule : 네이버 블로그

세룰리안블루는 그래뉼래이션이 있어요.

blog.naver.com

 

 

https://blog.naver.com/oshares/223618070469

 

Cerule has granule : 네이버 블로그

세룰리안블루는 그래뉼래이션이 있어요.

blog.naver.com

 

자바의 상속은 클래스 단위로 상속되는거야? 메소드를 상속할 수도 있어??

ChatGPT의 말:

ChatGPT

네, 자바의 상속은 클래스 단위로 이루어집니다. 즉, 하나의 클래스가 다른 클래스를 상속받으면, 상속받은 클래스는 부모 클래스의 필드(변수)와 메소드(함수)를 모두 상속받게 됩니다.

상속을 통해 메소드를 재사용할 수 있고, 필요한 경우 오버라이딩(재정의)하여 기능을 변경할 수도 있습니다. 예를 들어

 

위의 예시에서 Child 클래스는 Parent 클래스를 상속받고, show() 메소드를 오버라이딩하여 자신만의 동작을 정의하고 있습니다. 이렇게 해서 상속받은 메소드를 활용할 수 있습니다.

https://blog.naver.com/oshares/223617551347

 

Scanner sc = new Scanner(System.in); int a = sc.nextInt(); System.out.println(a);

 

이렇게 하는게 제일 쉽지만, 스캐너를 쓰면 처리속도가 시간이 더 걸린다고 한다.

그래서 사용해야 하는 것이 BufferedReader(이하 버퍼리더)와 BufferedWriter!(이하 버퍼라이터)

학원에서는 아직 배우지 않았지만 한번 공부해보고 싶어서 혼자 문제를 풀어보았다.

 

BufferedReader는 입력

입력할 때 버퍼에 값이 저장되었다가 한번에 출력된다고 한다.

BufferedReader는 엔터만 경계로 인식하기 때문에 스페이스바를 칠 경우에는 값을 분리해주어야한다.

백준 사이트에서는 각 값을 String 배열로 처리해서 " "공백으로 스플릿 한 다음 두 값을 배열에 넣어주었다.

String [] strs= br.readLine().split(" "); 
a = Integer.parseInt(strs[0]); 
b = Integer.parseInt(strs[1]);
 

 

그리고 버퍼리더는 스트링 즉 문자열만을 입력받는다. 그래서 입력받은 문자열을 다시 인티저로 형변환을 해줘야한다.

이때 사용하는 코드가 Integer.parseInt!

위 사이트에 따르면 버퍼리더는 스캐너에 비해서 사용하기가 불편하지만, 많은 양의 데이터를 입력받을 경우 효율적이고 속도가 난다고 한다.

위 사이트를 참고하여 나도 필기 배끼듯이 정리해본다.

선언.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 

특이하게 인풋스트림리더라는 것을 한번 더 써줘야한다. 왜 그런지는 아직 나도 잘 모름

그리고 readline을 할 때마다 try&catch 혹은 throws IOException을 통해서 '예외처리'라는 것을 해주어야 한다고.

 

BufferedWriter는 출력.

버퍼라이터 선언은 아래와 같다.

BufferedWriter bw = new BufferedWriter (new OutputStreamReader(System.out));
 

다행히도 리더 입력이랑 딱 대칭적이다 ㅋㅋㅋㅋ

버퍼를 잡았기 때문에 꼭 flush와 close를 해주어야한다고 한다.

아래는 버퍼리더와 라이터를 사용해 푼 백준문제

내친구 피티(챗지피티) 가 도와주었다 ㅋㅋㅋㅋ

 

package BJ; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 

public class day1013 { 
    public static void main(String[] args) throws NumberFormatException, IOException { 
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        int num = Integer.parseInt(br.readLine()); 
        int sum[] = new int [num]; 
        int a=0, b=0; 
        for (int i =0; i <num; i++) { 
        	String [] strs= br.readLine().split(" "); 
            a = Integer.parseInt(strs[0]); 
            b = Integer.parseInt(strs[1]); 
            sum[i] = a+b; 
        } 
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
        for (int i =0 ; i <num; i++) { 
        	bw.write(String.valueOf(sum[i])); 
            bw.newLine(); 
            } 
        bw.flush(); 
        bw.close(); 
    } 
 }


 

https://blog.naver.com/oshares/223617268596

 

Cerule has granule : 네이버 블로그

세룰리안블루는 그래뉼래이션이 있어요.

blog.naver.com

 

1.

JAVA에서는 클래스 내부에 변수를 만들때 private 이라는 접근제한자를 쓰라고 권장한다고 한다.

이렇게 되면 다른 클래스에서는 해당 변수에 접근이 불가능해진다.

이때 이 변수를 가져다 쓰거나 수정하기 위해 getter와 setter가 사용된다.

private 접근제한자의 사용

chat gpt

Java에서 private 접근 제한자는 주로 클래스의 내부 구현을 숨기고, 외부에서 직접 접근하지 못하도록 보호하기 위해 사용됩니다. 이렇게 하면 다음과 같은 이점을 얻을 수 있습니다:

  1. 캡슐화: 객체의 상태를 보호하고, 클래스 외부에서 잘못된 방식으로 변경되지 않도록 합니다. 이를 통해 데이터의 무결성을 유지할 수 있습니다.
  2. 유지보수 용이성: 내부 구현을 변경하더라도 외부 코드에 영향을 미치지 않도록 할 수 있습니다. 이는 코드의 변경이나 업데이트를 용이하게 만듭니다.
  3. 제어된 접근: 필요한 경우 getter/setter 메서드를 통해서만 외부에서 데이터를 접근하거나 수정할 수 있도록 제어할 수 있습니다. 이를 통해 데이터 접근 방식을 명확히 정의할 수 있습니다.

예를 들어, 클래스의 필드가 private로 선언되면, 해당 클래스 내부에서만 접근이 가능하고, 다른 클래스에서는 직접적으로 접근할 수 없습니다.


setter를 통해 변수를 수정할 수 있고

getter를 통해 변수를 가져올 수 있다.

public int getter(){
return a;
}
public void setter(int a){
this.a = a;
}

getter에서는 a라는 정수값을 내보내야 하므로 내보내는 변수형식을 int 로 바꿔준다.

setter는 int a를 받아와서 그 값을 자기자신에게 다시 넣는 형식인데,

여기서 this 는 본래 자기자신의 값 a를 말하는데, 자기자신 a와 받아온 a 변수의 이름이 같을 경우에 구분하기 위해 사용하는 것 같다.

2.

생성자의 사용.

생성자를 굳이 쓰는 이유는?

chat gpt

생성자를 안써도 되지 않아? 굳이 왜 쓰는건지 잘 와닿지가 않아

ChatGPT said:

ChatGPT

맞아요, 생성자를 사용하지 않아도 Java에서 객체를 생성할 수는 있습니다. 그러나 생성자를 사용하는 이유를 좀 더 구체적으로 설명해볼게요:

  1. 초기화의 명확성: 생성자를 사용하면 객체를 만들 때 필요한 초기 값을 명확하게 설정할 수 있습니다. 예를 들어, Person 객체를 만들 때 이름과 나이를 지정할 수 있습니다. 이렇게 하면 객체가 올바른 상태로 시작되므로, 코드에서 객체가 어떤 상태인지 쉽게 이해할 수 있습니다.
  2. 객체의 불변성 유지: 생성자를 통해 객체의 속성을 한 번만 설정하고, 이후 변경하지 않도록 할 수 있습니다. 예를 들어, final 필드가 있는 클래스를 생각해보면, 생성자를 통해 한 번만 값을 설정할 수 있습니다. 이렇게 하면 데이터의 무결성을 유지할 수 있습니다.
  3. 복잡한 초기화 로직: 경우에 따라 객체를 초기화하는 과정이 복잡할 수 있습니다. 생성자 내에서 초기화 로직을 작성하면 코드가 깔끔해지고, 객체 생성 시 필요한 모든 작업을 한 곳에서 처리할 수 있습니다.
  4. 기본값 설정: 기본 생성자를 사용하여 객체가 생성될 때 자동으로 기본값을 설정할 수 있습니다. 이 경우, 객체가 예상치 못한 상태로 시작되는 것을 방지할 수 있습니다.
  5. 다양한 객체 생성: 오버로딩을 통해 다양한 생성자를 정의할 수 있어, 같은 클래스의 객체를 여러 방식으로 생성할 수 있습니다. 이를 통해 코드의 유연성을 높일 수 있습니다.

결국, 생성자는 객체의 일관성을 유지하고, 코드의 가독성을 높이며, 복잡한 초기화 로직을 깔끔하게 처리하는 데 도움을 줍니다. 객체 지향 프로그래밍의 기본 원칙 중 하나인 캡슐화를 지키는 데도 중요한 역할을 합니다.

그렇다네요. 캡슐화...

3.

DTO(Data Transfer Object)

chat gpt 무슨말인지 모르겠다...ㅎㅎ

Data Transfer Object (DTO)는 주로 데이터 전송을 목적으로 하는 객체로, 여러 계층이나 시스템 간에 데이터를 효율적으로 전달하기 위해 사용됩니다. DTO는 주로 다음과 같은 특징을 가지고 있습니다:

  1. 단순한 구조: DTO는 일반적으로 속성(필드)만 가지고 있으며, 비즈니스 로직이나 메서드는 포함하지 않습니다. 이는 데이터를 저장하고 전송하는 데 중점을 두기 때문입니다.
  2. 직렬화: DTO는 주로 네트워크를 통해 데이터를 전송할 때 사용되므로, 직렬화(Serialization)가 가능해야 합니다. 이를 통해 객체를 바이트 스트림으로 변환하여 전송할 수 있습니다.
  3. 계층 간 데이터 전송: DTO는 주로 프레젠테이션 계층(예: 웹, 모바일 앱)과 서비스 계층(예: 서버, 데이터베이스) 간에 데이터를 전송할 때 사용됩니다. 이를 통해 계층 간의 의존성을 줄이고, 데이터 전송을 표준화할 수 있습니다.
  4. 네트워크 효율성: DTO를 사용하면 필요한 데이터만 전송할 수 있어, 불필요한 데이터 전송을 줄이고 성능을 개선할 수 있습니다.
  5. 타입 안전성: DTO는 명확한 타입을 가지므로, 컴파일 타임에 타입 검사를 통해 오류를 줄일 수 있습니다.


추가,

프로젝트를 하다보니 DTO의 개념에 대해서 이해했다.

DTO는 마치 '내가 만든 상품꾸러미' 같은 느낌이다.

프론트-서버-데이터베이스 간에 정보를 서로 전달할 때, 미리 정의된 DTO를 사용하면 좀 더 간편하고 안정성있게 데이터를 주고받을 수 있는 것 같다.


하여튼 일단 구조가 단순해지는 것 같다. 데이터 저장하고 전송하는데 중점을 두는 객체이기 때문!

주로 getter 와 setter가 포함된다.

그리고 이와는 다르게 연산을 담당하는 클래스는 Service로 명칭한다고 하셨다.

그래서 지금 해보는 것은 하나의 프로그램을 dto와 service파트로 나눠서 만들어보기

지난번에 못했던 atm 프로그램을 혼자서 한 번 만들어 볼 생각이다.

'JAVA(초기 공부)' 카테고리의 다른 글

[JAVA] 1014 상속 Inheritance  (0) 2025.03.08
[JAVA] 1013 BufferedReader와 BufferedWriter  (0) 2025.03.08
[JAVA] Class 와 Method  (0) 2025.03.08
[JAVA] Collection Framework  (0) 2025.03.08
0926 java 시작  (0) 2025.03.08

https://blog.naver.com/oshares/223612865377

 

Cerule has granule : 네이버 블로그

세룰리안블루는 그래뉼래이션이 있어요.

blog.naver.com

 

Class

틀 같은 느낌. 클래스이름의 첫 문자는 대문자!

사용자가 원하는 타입과 기능을 추가해서 생성.

Class를 이용해서 변수를 만드는 것을 instance라고 한다고

Class를 만들어두고 Classname.을 사용해서 기능을 끌어와서 쓸 수 있다.

이때 어떤 기능들은 String , int와 같은 변수들에 저장해서 쓰기도 하는것 같은데

여기저기 저장해가면서 써보아야겠다.

Method

기능

독립적인 기능을 가지는 작은 프로그램이라고.

메소드 이름의 첫 문자는 소문자

접근제한자 반환자료형 메소드 이름 (매개변수){

}

그래서 일단 지금은 public void name (){} 식으로 사용하기로 함

void는 반환자료형이 없을 때

반환자료형이랑 매개변수를 어떻게 써야할 지가 아직 많이 헷갈리는데

좀 더 연습해보아야 할 것 같다.

오 근데 이렇게 소스코드를 넣는 기능이 있었네?ㅋㅋㅋ

System.out.println("여기서 막히다니요..."); System.out.println("더 열심히 해보져뭐^^");
 

'JAVA(초기 공부)' 카테고리의 다른 글

[JAVA] 1013 BufferedReader와 BufferedWriter  (0) 2025.03.08
[JAVA] 1013 getter와 setter, private 접근제한자  (0) 2025.03.08
[JAVA] Collection Framework  (0) 2025.03.08
0926 java 시작  (0) 2025.03.08
0925 git 이론정리 2  (0) 2025.03.08

https://blog.naver.com/oshares/223612843004

 

Cerule has granule : 네이버 블로그

세룰리안블루는 그래뉼래이션이 있어요.

blog.naver.com

 

수업시간에 배운 내용과 내가 좀 더 찾아본 내용을 취합하여 정리해둠

컬렉션 프레임워크는 표준화된 기본 '틀'같은 것

List, Set, Map 같은 것들이 있다.

Set은 수학에서 1단원에 배우는 집합같은 존재로 보면 되고,

List는 배열과 비슷한 것, index 번호가 붙은 순차적인 자료들

Map은 key와 value가 쌍으로 이어진 구조의 데이터와 관련된 업무를 수행해야할 때 사용한다.

Collection 인터페이스를 이용하면, 나중에 set, list로 바꿀 수 있으나,

처음부터 set을 쓰면 list는 못쓴다고한다. 이는 상속관계와 관련이 있다고만 정리해둠

1. HashSet

수학의 '집합'이 프로그램화 된 것!

생성: HashSet<Integer> name = new HashSet <Integer>(); * import필요

특징: 순서를 유지하지 않는 데이터의 집합으로, 데이터의 중복을 허용하지 않는다. (집합 생각할 것!) -> 유일한 값의 처리에 사용됨

순서를 유지하지 않으므로 index로 접근이 불가능하다.

list 보다는 처리속도가 빠르다는 장점이 있다.

사용방식

name={1,2,3}, B={3,4,5}, C={1,2} 일때

name.containsAll(B) ? false

name.addAll(B) = {1,2,3,4,5,} : 중복되는 값은 하나만 저장된다.

name.retainAll(B) = (교집합을 말함): {3}

name.removeAll(B) = {1,2} 차집합

*내가 어려웠던 기능 iterator

-gpt가 알려주는 iterator 사용이유

Iterator는 Java에서 컬렉션을 순회할 때 사용되는 인터페이스로, 다음과 같은 경우에 유용합니다:

  1. 컬렉션 요소 접근: Iterator를 사용하면 컬렉션의 요소를 하나씩 접근할 수 있습니다. 이때 인덱스를 사용하지 않기 때문에, 어떤 종류의 컬렉션(리스트, 세트 등)에서도 동일한 방식으로 접근할 수 있습니다.
  2. 순회 중 요소 삭제: Iterator를 사용하면 컬렉션을 순회하면서 안전하게 요소를 삭제할 수 있습니다. Iterator의 remove() 메소드를 사용하면 ConcurrentModificationException을 피할 수 있습니다.
  3. 다양한 컬렉션 지원: Iterator는 모든 Java 컬렉션 프레임워크 클래스에서 지원하므로, 통일된 방법으로 다양한 컬렉션을 다룰 수 있습니다.
  4. 간결한 코드: for-each 루프(Enhanced for loop)와 함께 사용할 수도 있어, 코드가 더 간결하고 가독성이 높아집니다.

-iterator는 컬렉션에 있는 값들을 배열 형식으로 만들어준다.

-처음 위치는 bof, 맨 마지막 위치는 eof로 저장된다.

Iterator <String> name = set.iterator();

name.next => 값을 꺼내올 수 있다.

while(name.hasNext()){

String key = name.next(); <-값을 key라는 변수에 저장

시스아웃 key

}

-> hasNext가 false가 될 때까지 값을 출력한다.

2. ArrayList

생성: ArrayList <String-자료형> 이름 = new ArrayList <String> (); & import 필요

여기서 자료형에는 대문자로 된 Wrapper Class만 들어갈 수 있어서,

int 형식을 쓸 경우에는 Integer를 써줘야함!

특징: 배열과 흡사하고, 크기가 가변적이다. 계속해서 증가가 가능하다.

순서가 있는 데이터의 집합이며 데이터의 중복을 허용한다.

사용방식 - 이름 뒤에 쩜을 찍으면 수많은 기능들과 구동방식을 볼 수 있다.

입력: name.add(100); => 순차적으로 0번째부터 저장된다.

개별적인 출력: name.get(n); => n번째 값이 출력된다.

(필요한 경우 꺼내와서 저장도 가능! int a = name.get(n); 이를 사용하여 연산도 가능)

for 함수 쓸 때 .length대신 name.size를 사용한다.

비교기능: name.contains(값)

등등

자주쓰는 것 아니면 찾아보면서 쓰면 된다고 하심.

일단 입력 출력정도는 꼭 외워두자!

3. HashMap

함수function을 프로그램화 한 것

생성: HashMap <String, String> name = new HashMap <string,. String> ();

key와 value를 쌍으로 가지므로 위와 같은 방식으로 key와 value의 자료형을 지정해주어야 한다.

특징:

순서는 유지되지 않는다.

키의 값은 중복이 허용되지 않지만, 값은 중복을 허용한다.

(키가 같으면 무엇을 구하는 건지를 알 수 가 없음)

기능:

name. put(문자, 문자) = epdlxj dlqfur

name.get (key) 로 value 출력

name.remove로 값 삭제

연산이 필요할때 iterator를 사용하는데, 맵 자체는 iterator 기능이 없는 듯 하다.

그래서 set으로 변환해서 사용하는 것 같은데, 이 부분은 아직 잘 모르겠다.

좀 더 연구가 필요함

-> 실제로 그렇다고 함

질문: java의 컬렉션 중 map 자체는 iterator 기능을 안가지고 있어? 그래서 set으로 변환해서 사용하는게 맞아?

ChatGPT said:

ChatGPT

맞습니다. Java의 Map 인터페이스는 직접적으로 Iterator를 제공하지 않습니다. 대신, Map의 키, 값, 또는 엔트리 집합에 대한 Set 뷰를 통해 Iterator를 사용할 수 있습니다.

방법

  1. keySet(): 맵의 모든 키를 포함하는 Set을 반환합니다. 이 Set에 대해 Iterator를 사용할 수 있습니다.

2. values(): 맵의 모든 값을 포함하는 Collection을 반환합니다. 이 Collection에 대해 Iterator를 사용할 수 있습니다.

3. entrySet(): 맵의 모든 키-값 쌍을 포함하는 Set<Map.Entry<K, V>>를 반환합니다. 이를 통해 키와 값 모두를 순회할 수 있습니다.

결론

Map 자체는 Iterator를 직접 지원하지 않지만, 위와 같은 방법으로 키, 값, 또는 키-값 쌍을 순회할 수 있습니다. Set이나 Collection으로 변환한 후 Iterator를 사용하는 것이 일반적인 패턴입니다.

'JAVA(초기 공부)' 카테고리의 다른 글

[JAVA] 1013 getter와 setter, private 접근제한자  (0) 2025.03.08
[JAVA] Class 와 Method  (0) 2025.03.08
0926 java 시작  (0) 2025.03.08
0925 git 이론정리 2  (0) 2025.03.08
0924 git 이론 정리  (0) 2025.03.08

자바는 그래도 약간 예습을 해서 아직까지는 따라갈 수 있는 느낌이다.

java를 실행하려면 java development key (JDK)가 있어야 실행가능해서 오라클에서 다운받았다.

tip

조금씩 작성하면서 실행을 해보는 것이 좋다!

내가 아는 것 한도 내에서 개발을 진행하게 된다.

적게 알면 몸이 고생할 수도 있다....ㅜㅡ but 결과만 잘 나오면 된다고!

  1. git hub에 자바 작업 올리기

아 이래서 깃을 그렇게 배웠구나!

Day01폴더 들어가서 깃배쉬 열어 깃이닛부터 시작

(1) 숨겨야 하는 것들은 숨기기: gitignoreit인가 사이트에서 자바 입력하면 뭘 숨겨야할지 알려줌

(2) 깃허브에 리파지토리를 만든다-> class명과 동일하게 만들어야 나중에 오류가 발생하지 않음

집에가서는 clone 받아서 한 번 시도해보자!

2. 명령어

(1) 출력

System.out.println(출력할 내용);

출력할 내용이 문자라면 "쌍따옴표"안에 써줘야 한다.

println으로 쓰면 자동 줄바꿈이 되고, print만 쓰면 줄바꿈 되지 않음

이름:(입력창)만들 경우 print만 써야함

ESCAPE 명령어
기능
\n
new line 새로운 줄로 이동
\t
tab 탭 크기만큼 이동
줄맞추기 할때 사용하면 좋음
\"
쌍따옴표를 출력해줌
\\
역슬래쉬를 출력함

3. 변수

데이터를 저장하기 위한 공간: 폴더 같은 공간이라고

-첫 문자는 무조건 소문자로 지정하고, 합성어의 첫 문자는 대문자로 사용한다

-예약어는 사용할 수 없다: 자바에서 이미 사용하고 있는 단어 public 이런단어들 불가!

-의미를 부여해서 영어로 만드는 것이 좋다

int / short / long (자료명) 변수이름; : 변수선언

자료명 변수이름= 초기값; 변수를 선언하면서 동시에 초기화를 진행

char는 문자 하나를 저장해서 무조건 ''작은따옴표를 쓰고

str은 문자열을 저장해서 무조건 큰 따옴표를 쓰는데...

문자열이라고 다 저장되는 것은 아닌듯

문장을 입력했더니 앞의 세 단어인가만 떴다..ㅠㅠ 질문해보아야함!

4. 상수화

final 변수 변수명 = ""

변수명이 KOREA 등 과 같은 대명사일 경우에는 상수화를 해주면 더 이상 변경이 불가능하다

상수화 되는 변수 이름은 대문자로 짓는 규칙이 있다. (거의 외치는 급ㅋㅋㅋ)

주로 이후에 팀플젝 등을 할 때 공통으로 사용되는 경로를 고정하기 위해 사용된다

5. 형변환

자료형을 변환시키는 것을 말한다.

예를들어

char ch02 = 'A'; //ch02변수는 만들어짐과 동시에 초기화가 된다.

int ret; // ret은 선언만 된다.

이후

System.out.println((int)ch02);

를 입력하면 정수형으로 변환된 A의 값이 출력됨

여기서 대문자A는 아스키코드로 65여서 65가 출력된다.

6. 입력받기 (내가 제일 헷갈리던 것)

Scanner 스캐너이름 = new Scanner(System.in);

ctrl + alt + o

int num; 선언하고

num = 스캐너이름. nextInt(); <-무엇을 입력받을지를 알려줌

Scanner scan = new Scanner(System.in); //이 문장은 한번만 쓰면 되는듯

String name; //선언한다

System.out.print("당신의 이름은 무엇입니까?");

name = scan.next(); //string 입력시에는 next만 쓰면됨

이렇게 쓰면 당신의 이름은 무엇입니까 뒤에 입력할 수 있게 된다.

 

'JAVA(초기 공부)' 카테고리의 다른 글

[JAVA] Class 와 Method  (0) 2025.03.08
[JAVA] Collection Framework  (0) 2025.03.08
0925 git 이론정리 2  (0) 2025.03.08
0924 git 이론 정리  (0) 2025.03.08
0923 git 명령어  (0) 2025.03.08

+ Recent posts