티스토리

Dr.Mlem Blog
검색하기

블로그 홈

Dr.Mlem Blog

dr-mlem.tistory.com/m

Dr.Mlem knows nothing but borking

구독자
1
방명록 방문하기

주요 글 목록

  • Go) 패닉이 발생하는 경우, 그리고 recover() Q1.Go에서 패닉이 일어나는 경우들을 적어줘   A1.Go에서 **panic(패닉)**이 발생하는 경우들은 몇 가지 주요 카테고리로 나뉩니다. 아래는 대표적인 panic 발생 상황들과 예제를 정리한 표입니다:✅ Go에서 패닉(panic)이 발생하는 대표적인 경우상황예시설명1. 배열, 슬라이스, 문자열 인덱스 초과s := []int{1, 2}; fmt.Println(s[5])존재하지 않는 인덱스 접근2. nil 포인터 참조var p *int; fmt.Println(*p)nil을 역참조(dereference)3. map에서 nil 맵에 할당 시var m map[string]int; m["a"] = 1선언만 하고 초기화하지 않은 맵4. 채널에 nil 채널 사용var ch chan int; ch nil 채널에.. 공감수 0 댓글수 0 2025. 4. 13.
  • Go) GoRoutine, Mutex, Channel, waitGroup Q1.일단 내가 이해한 내용이야. 1. 고루틴은 한 번에 한 함수를 GO 키워드를 붙여서 여러개 작동시키는 기능.2. waitgroup은 waitgroup에 추가된 고루틴을 끝날때까지 다음 코드로 진행하지 않게 대기시켜주는 기능. 3. Mutex는 특정 요소에 동시에 접근할 때, 해당 요소에 실질적으로는 한 번에 한 번씩만 접근할 수 있게 제한을 거는 기능 이렇게 이해했고, 채널은 해당 코드만 보면 잘 모르겠어. 1. 내가 이해한 내용이 맞는지? 2. 채널을 설명하는 코드를 좀 더 작성해줄래?   A1.네 정리 너무 잘했어!고루틴, WaitGroup, Mutex에 대한 개념 이해는 거의 완벽해.아래에 각각 코멘트 달아볼게:✅ 1. 너의 이해 내용 검토항목너의 설명정확도보출 설명고루틴go 키워드를 붙여서 .. 공감수 0 댓글수 0 2025. 4. 13.
  • Go) 변수의 재사용, := 여기에서 왜 아래의 err에 새 변수로 인식되지 않는거야? ChatGPT의 말:아주 좋은 질문이야!너가 말한 이 코드에서 발생하는 문제는 Go의 변수 선언 범위(scope)와 shadowing 규칙 때문이야.🔍 상황 다시 보기go복사편집// 먼저 여기서 err 선언 hashedPW, err := utils.HashPassword(req.PW) if err != nil { utils.HandleErrResponse(ctx, 500, "700?", "비밀번호 해싱 실패") return } // 그리고 여기서 또 err := ... 로 선언 _, err := db.DB.Exec(query, req.ID, hashedPW) 🔥 왜 문제가 되냐면?Go는 같은 블록(scope) 안에서는 같은 이름의 변수를 :=.. 공감수 0 댓글수 0 2025. 4. 9.
  • Go) 변수 대문자로 시작하는 경우 Q1.Go에서, 변수인데도 어쩔 때에는 대문자로 시작하는 것 같기도 하더라구. 구조체 안의 변수값으라든가 뭐 이런 특수한 상황에서만 변수의 시작 문자를 대문자로 쓰는건지, 아니면 GO 만의 특별한 규칙이 있는지 잘 모르곘어. 설명해줄래? A1.좋은 질문이야! Go에서 변수 이름을 대문자로 시작하느냐, 소문자로 시작하느냐는 단순 스타일 차이가 아니라, "접근 범위(가시성)"을 결정짓는 중요한 문법 규칙이야. 👇✅ Go의 변수/함수/필드 이름 규칙 핵심이름 시작 문자외부에서 접근 가능?설명대문자 시작 (ID, Name)✅ 공개됨 (exported)다른 패키지에서 접근 가능소문자 시작 (id, name)❌ 비공개 (unexported)해당 패키지 내에서만 사용 가능🔍 예를 들어📦 패키지 model에 구조.. 공감수 1 댓글수 0 2025. 4. 8.
  • Go) 리플렉션 기반 동적 함수 생성 func makeSum(fptr interface{}){ // fptr은 왜 포인터인가? 여기서 선언된 내용 자체만으로 보면, fptr은 포인터라고 정해져있지 않으나, // 포인터가 아닌 값이 들어오면 아래의 코드가 참조되지 않기에 의미가 없음. fn:=reflect.ValueOf(&ptr).Elem() v:= reflect.MakeFunc(fn.Type(), sum) fn.Set(v)}​다시 돌아와서,var intSum func(int, int) int64 이런 타입의 함수가 있는데makeSum(&intSum) 이렇게 되면fmt.Println(intSum(1, 2)) 왜 이게 3이 되는지 알고 싶어. 코드의 진행 과정을 하나하나 짚어줘. 1. 왜 makeSum에 변수의 포인터를 참조시켰는지.. 공감수 0 댓글수 0 2025. 4. 7.
  • Go) 구조체와 태그 구조체에 붙이는 태그라는건 뭐야? ChatGPT의 말:좋아, 아주 좋은 질문이야! 👏Go의 **구조체(struct)에 붙이는 태그(tag)**는구조체 필드에 메타데이터(데이터에 대한 정보)를 문자열 형태로 붙여서,리플렉션(reflection)으로 읽어 쓸 수 있게 해주는 기능이야.✅ 구조체 태그란?구조체 정의할 때 필드 옆에 붙이는 백틱(```) 안의 문자열이 태그야.type Person struct { Name string `json:"name"` Age int `json:"age"`}위 예제에서:"json:\"name\"" → 이게 태그임!이건 "JSON으로 인코딩하거나 디코딩할 때 이 필드를 name이라는 키로 매핑해라"는 뜻이야.📌 태그의 형식태그는 일반적으로 다음 형태로 작성돼:`키이.. 공감수 0 댓글수 0 2025. 4. 7.
  • Go) interface와 type assertion A1.좋아! 😎지금부터 interface{}(빈 인터페이스)와 일반 인터페이스 타입(예: io.Reader, fmt.Stringer 등)의 차이점을 명확히 정리해줄게!✅ 먼저 정리부터!구분interface{}일반 인터페이스( fmt.Stringer, io.Reader 등)의미빈 인터페이스메서드를 요구하는 인터페이스메서드없음특정 메서드가 반드시 구현돼야 함어떤 타입이 담기나?모든 타입해당 인터페이스를 구현한 타입만유연성매우 높음 (모든 타입 수용)제한적 (명시된 메서드 구현 필요)사용 예fmt.Println, sync.Pool, JSON 처리 등I/O, 문자열 출력, 인터페이스 기반 설계 등🔍 interface{}: 빈 인터페이스func anything(v interface{}) { fmt.Printl.. 공감수 0 댓글수 0 2025. 4. 7.
  • Go)pool과 빈 interface package mainimport ( "fmt" "math/rand" "runtime" "sync")type Data struct{// Data 구조체 tag string // 풀 태그 buffer []int // 데이터 저장용 슬라이스}func main(){ runtime.GOMAXPROCS(runtime.NumCPU()) pool := sync.Pool{ // 풀 할당 New: func() interface{} { // Get 함수를 사용했을 때 호출될 함수 정의 data := new(Data) // 새 메모리 할당 data.tag = "new" // 태그 설정 data.buffer = make([]int, 10) // 슬라이스 공간 할당 return data // 할.. 공감수 1 댓글수 0 2025. 4. 7.
  • Go) for 와 range Q1.for i := range "어떤 집합" 이렇게 하면 해당 반복문은 어떤 집합의 길이만큼 하는 것이고,거기서 i는 반복문의 횟수를 의미하는거지?    A1.정확해! 💯너 지금 Go의 for i := range 어떤집합 문법을 정확하게 이해하고 있어.그 내용을 한 번 깔끔하게 정리해줄게 👇✅ for i := range 어떤집합 의 의미for i := range 어떤집합 { fmt.Println(i)}이 문법은:해당 집합의 길이만큼 반복하면서, 인덱스(또는 키)만 꺼내는 반복문이야!i는 반복 횟수를 의미한다기보다는,**"해당 집합의 인덱스 또는 키"**를 의미해배열(slice), 맵(map), 문자열(string) 등 다양한 집합 타입에서 사용할 수 있어📌 예제: 슬라이스일 경우arr := []s.. 공감수 0 댓글수 0 2025. 4. 7.
  • Go) 클로저 캡처 문제 + 고루틴 동작 순서 package mainimport ( "fmt" "runtime")func main(){ runtime.GOMAXPROCS(1) s:= "hello world" for i:=0; iQ1.난 이 코드 출력이 99, 0, 1,2,3, 이 순서인데 뭐가 문제지?    A1.좋아! 지금 네가 겪고 있는 출력 순서의 혼란은,Go의 고루틴(goroutine)과 익명 함수 클로저의 동작 원리 때문에 생긴 아주 대표적인 예야.질문 핵심은:왜 고루틴을 100개 실행했는데 출력이 0부터 순서대로가 아니고, 99, 0, 1, 2, ... 식으로 이상한 순서로 출력되는가?✅ 핵심 결론 먼저너의 코드는 동시성 + 비결정성 + fmt.Scanln() 전까지 실행 순서가 보장되지 않음클로저 안에서 i 값을 바로 넘기지 않으면 헷갈.. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) 클로저 캡처 문제 요약 ❓ 질문:for i := 0; i go func() { fmt.Println(i)}()왜 때때로 출력이 100, 100, 100... 처럼 잘못된 값이 나오는 거야?✅ 답변:이건 Go에서 클로저가 외부 변수 i를 참조하기 때문이야.go func() { ... }() 형태의 익명 함수는 반복문 변수 i를 복사하는 게 아니라 "참조"함그래서 루프가 끝난 뒤에 고루틴이 실행되면,이미 i == 100이 되어버려서 모든 고루틴이 동일한 값을 출력하게 됨이걸 "클로저 캡처 문제"라고 해❓ 질문:그럼 이걸 해결하려면 어떻게 해야 돼?✅ 답변:반복문 변수 i를 함수 매개변수로 넘겨서 "복사본"을 만들어야 해.예를 들어:for i := 0; i 이렇게 하면 i의 현재 값이 n으로 복사되어 고루틴 내부에서 안전하게 사용 .. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) ready 상태 channel이 복수면? go func(){ for{ // 무한 반복 select{ case c1이 코드에서 궁금한게, c1이랑 c2가 동시에 준비되는 순간에는 어떻게 되는거야?  A.좋아, 이건 Go의 select 문이 가진 핵심적인 특징 중 하나를 짚는 아주 좋은 질문이야! 👏네 질문은 이거지:select문 안의 두 개 이상의 case가 동시에 ready일 때,즉, 예를 들어 c1 Go는 어떤 case를 실행할까?✅ 정답: 무작위(random)로 하나만 선택해서 실행해Go 언어의 select 문은 복수의 채널 연산이 동시에 가능할 때,그 중 하나를 무작위로(randomly) 선택해서 실행해.📌 공식 문서 표현 (Go spec)If multiple cases in a select are ready, one is c.. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) Channel, select 2 package mainimport ( "fmt" "time")func main(){ c1 := make(chan int) // int 형 채널 c1 생성 go func() { for{ i:=이 코드와package mainimport ( "fmt" "time")func main(){ c1 := make(chan int) // int 형 채널 c1 생성 go func() { for{ i:=이 코드의 차이는 무엇이지?  A1.좋아! 🔥이 두 코드는 구조가 굉장히 비슷해 보이지만,세 번째 고루틴 (select 사용 부분) 에서 미묘한 차이가 있고,그게 실제 실행 흐름과 결과에 매우 큰 차이를 만들어.✅ 두 코드의 핵심 차이 요약코드select 내부 case 비교의미 코드select 내부 case 비.. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) Channel, select package mainimport ( "fmt" "time")func main(){ c1 := make(chan int) // int 형 채널 c1 생성 c2 := make(chan string) // string 형 채널 c2 생성 go func() { for{ i:=이 코드에서,go func(){ for{ // 무한 반복 select{ case c1이 부분에서, case를 어떻게 나눠지고 어떻게 작동되는지 잘 모르겠어.case의 조건이 어떻게 정해지는거야? case s:= ... 이 부분은, c2 채널에 값이 들어온걸 기준으로 하는거야, 값이 s일때 기준이라는거야 뭐야?    A1.좋아! 이 질문 정말 핵심적인 부분을 짚었어 💡Go의 select 문에서 case가 어떻게 작동하는지,특.. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) 포인터 자동 역참조 You said:// 구조체 포인터?package mainimport ( "fmt" _ "fmt")type Rectangle struct { Width int Height int}func main() { var rect1 *Rectangle rect1 = new(Rectangle) // new()로 메모리 할당 후 포인터를 반환 rect2:=new (Rectangle) // new()로 메모리 할당 후 포인터를 반환 rect1.Height = 10 rect2.Height = 20 // rect2는 포인터이므로, rect2.Height로 접근 가능 fmt.Println(rect1.Height) // Output: 10 fmt.Println(rect2.Height) // Output: 20 fmt.Prin.. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) recover() // 패닉-리커버 함수package mainimport "fmt"func f (){ defer func(){ s:=recover() // panic이 발생하면 recover()가 호출됨 fmt.Println(s) // panic이 발생한 위치를 알 수 있음 }() // 즉시 실행 함수 꼴 panic("panic occurred") // panic 발생}func main() { f() fmt.Println("after panic") // panic이 발생해도 이 부분은 실행됨}Q1.여기에서, recover()만 하면 되는거 아니야? 왜 굳이 변수에 할당시키고 읽히게 하는거지?   A1.아주 좋은 질문이야! 👏recover()만 호출해도 panic은 "복구"되는데, 왜 굳이 s := recover() .. 공감수 0 댓글수 0 2025. 4. 6.
  • Go) go.mod, go.sum go.mod는 go init "프로젝트명"으로 작성되는 파일인가? 아니면 go mod tidy 로 작성되는 파일인가? ChatGPT의 말:좋아, 이건 Go 모듈 시스템의 핵심이야.너가 질문한 "go.mod" 파일이 어떻게 만들어지고, 어떤 명령어가 어떤 역할을 하는지 딱 정리해줄게! ✅✅ go.mod는 어떤 명령어로 만들어질까?🔹 go mod init [모듈명]👉 go.mod를 처음 생성할 때 사용하는 명령어예:go mod init my-project 결과:현재 디렉토리에 go.mod 파일이 생성됨내용은 대략 이런 형태:module my-projectgo 1.21✅ go mod tidy는 뭘 하는 명령어일까?👉 이미 있는 go.mod와 go.sum을 정리하거나, 필요한 의존성을 추가하거나 제거하는 .. 공감수 0 댓글수 0 2025. 4. 4.
  • 빈 식별자, blank identifier, _ data := MyStruct{A: 1, B: 2}jsonBytes1, _ := json.Marshal(data) // ✅ OKjsonBytes2, _ := json.Marshal(&data) // ✅ 이것도 OK​Q1.네가 작성해준 예시 코드, 이거 marshal한 데이터를 json byte 1, 2에 담겠다는 코드 같은데, 이때 _ 로 작성한 부분은, 원래 에러를 담는 위치이지만 에러날 일이 없을테니 그냥 버리고 쓰곘다 이 의미인가?   A1.💯 완벽하게 이해했어! 너 진짜 Go 감 잘 잡고 있다.말한 그 부분 정확하게 맞는 해석이야.✅ 코드 다시 보기jsonBytes1, _ := json.Marshal(data)여기서 _는 Go의 **“blank identifier” (빈 식별자)**라고 불.. 공감수 0 댓글수 0 2025. 4. 4.
  • Go) Unmarshal과 포인터 Q1.json.Unmarshal(ctx.PostBody(), &req) 이게 어떻게 진행되는지 알려줘   A1.좋아, 이 한 줄은 Go에서 JSON을 구조체로 파싱하는 핵심 라인이야.json.Unmarshal(...)이 어떤 식으로 동작하는지, 단계별로 완전 상세하게 설명해줄게! 🔍✅ 먼저 전체 코드 다시 보기json.Unmarshal(ctx.PostBody(), &req)json.Unmarshal(...) → Go 표준 라이브러리 encoding/json의 함수ctx.PostBody() → 클라이언트가 보낸 HTTP 요청 본문 (JSON 문자열, []byte 타입)&req → JSON을 여기에 파싱해서 채워줘! 라는 구조체의 주소 (포인터)🔁 동작 원리 단계별 설명1. ctx.PostBody()이건.. 공감수 0 댓글수 0 2025. 4. 4.
  • Go 포인터 공부 4 - 구조체 포인터로 접근하기 import "fmt"type Vertex struct { X int Y int}// 구조체 인스턴스 선언 방법var ( //① 일반적인 선언방식입니다. X가1, Y가 2로 초기화됩니다. v1 = Vertex{1, 2} //② X만 값을 지정해주고, Y는 int에 zero value로 설정됩니다. v2 = Vertex{X: 1} //③ X, Y모두 int에 zero value로 설정됩니다. v3 = Vertex{})func main() { fmt.Println("v1.X값:", v1.X) v1.X = 4 fmt.Println("v1.X = 4로 바꾼 v1.X값:", v1.X) //④ 구조체 포인터로도 구조체의 값을 바꿀 수 있습니다.. 공감수 0 댓글수 0 2025. 4. 3.
  • Go 포인터 3 너가 요청한 포인터 응용 예제들을 간단하고 핵심만 딱 짚는 예시들로 정리해줄게.총 3가지로 나눠서 설명할게:구조체 포인터배열 포인터함수 인자에 포인터 전달1️⃣ 구조체 포인터📌 개념구조체(예: type Person struct)의 주소를 포인터로 다루면해당 구조체 안의 값들을 직접 변경할 수 있음.✅ 예시type Person struct { name string age int}func main() { p := Person{name: "Alice", age: 25} ptr := &p // 구조체 포인터 ptr.age = 30 // 포인터를 통해 구조체 내부 값 변경 fmt.Println(p.age) // 출력: 30}🧠 ptr.age는 사실 (*ptr).age를 축약한.. 공감수 1 댓글수 0 2025. 3. 29.
  • Go 포인터 공부 2 Q.1. 어떤 변수명 앞에 &을 붙여서 해당 변수의 메모리 값을 해당 변수의 타입형을 다루는 포인터 변수에 새로 할당할 수 있어?2. 정수형 포인터의 메모리 주소를, 다른 정수형 포인터에 할당할 수 있어? A.좋은 질문이야! Go에서 포인터 관련해서 정확히 짚고 넘어가면, 너의 개념이 더 단단해질 거야. 두 질문 모두 아주 중요하고, 실무에서도 헷갈리기 쉬운 포인트들이라서 예제까지 같이 설명해줄게.✅ 1. &변수명을 통해 변수의 **메모리 주소를 포인터 변수에 할당할 수 있는가?`질문 요약: 변수 앞에 &를 붙이면 그 변수의 주소값이 나오는데,이걸 변수 타입에 맞는 포인터 변수에 넣어도 되는가?🔹 대답: YES!var num int = 42 // 일반 int 변수var p *int = &n.. 공감수 0 댓글수 0 2025. 3. 29.
  • 포인터가 쓰이는 이유? 오늘 공부한 내용에 따르면,  포인터가 쓰이는 이유는, 아직 선언하지 않은 변수/구조체/객체에 대해서  포인터를 이용하여 미리 접근할 수 있게 준비해둘수 있기 때문인건가요? -> 참조하기 위해서. 예를 들어서, 어떤 20바이트의 인스턴스를 파라미터로 넘기려고 하는데, 이걸 통으로 복사해서 넘기면 또 20바이트를 통으로 추가해서 사용해야 하는데, 이게 아쉬우니까 이걸 참조해서 사용할 수 있게 하려다보니 고안된 느낌. 공감수 0 댓글수 0 2025. 1. 14.
  • Go의 main 함수와 main 패키지 Q1.Go 언어에서는 main 함수가 프로그램의 시작점이고, 그 main 함수가 있는 패키지는 무조건 main 패키지여야 하는거야?   A1.ChatGPT의 말: 네, Go 언어에서는 main 함수가 프로그램의 시작점이고, 그 함수는 반드시 main 패키지에 속해야 합니다. 이것은 Go 프로그램의 실행 구조에서 필수적인 규칙입니다. 조금 더 자세히 설명드리겠습니다.이유와 원칙:main 패키지와 main 함수:Go 프로그램이 실행될 때 컴파일러는 main 패키지를 찾고, 그 안에 있는 main 함수를 실행점으로 삼습니다.따라서 프로그램의 진입점이 되는 main 함수는 반드시 main 패키지에 있어야 합니다.다른 패키지에서 main 함수 작성 불가:main 패키지 외의 다른 패키지에는 main 함수를 정의할.. 공감수 0 댓글수 0 2024. 12. 26.
  • JDBC JDBC Java.sql 이라는 패키지 안에, Java와 db 연동을 할 때 필요한 인터페이스들을 다 준비해두고,각각의 DBMS사에게 연동하는 라이브러리를, Java에서 만들어둔 이 인터페이스들을 상속받아서 구현하라고 한 것.=> 프로그램 만들 때에는, 코드가 통일 된다는 의미. 같은 인터페이스를 상속 받았기에, 메서드가 같아지니까. 이러한 체계를, Java DataBase Connectivity즉, JDBC 라고 함. 라이브러리 자체는 DBMS마다 따로 받아야 하지만, 결국 하나의 공통된 Java 인터페이스를 상속받아서 구현된 라이브러리이기에,Java쪽 코드는 균일하게 된다.     // https://mvnrepository.com/artifact/com.mysql/mysql-connector-j  .. 공감수 0 댓글수 0 2024. 12. 23.
  • MyBatis config.xml의 위치 Q1.Java 프로젝트에서, Gradle 프로젝트 빌드 라이브러리를 이용해서 MyBatis 프레임워크를 이용하려고 하는데, 이때 MySQL과의 접속 정보 설정값들과 mapper 들의 설정값이 적혀있는 config.xml의 파일은, 프로젝트최상단/app/src/main/resources 안에만 있을 수 있는건가?   A1.ChatGPT의 말:MyBatis의 config.xml 파일은 반드시 Gradle 프로젝트의 src/main/resources 디렉토리에 있어야 하는 것은 아닙니다. 하지만, MyBatis와 MySQL 연결 설정의 관행과 Gradle 빌드 시스템의 작동 방식을 이해하면 일반적으로 다음과 같은 이유 때문에 src/main/resources 디렉토리에 배치됩니다.1. Gradle의 리소스 관.. 공감수 0 댓글수 0 2024. 12. 18.
  • Spring의 dispatcherServlet? Q1.dispatcherServlet이라는 것에 대해서는 따로 내가 건드린 적이 없는데, 저것은 Spring에서 무엇을 하는 것이며, 코드를 작성하는 데에 있어서 별도로 설정해줘야 하는 것이 있는 것인가?    A1.ChatGPT의 말:좋은 질문입니다! DispatcherServlet은 Spring MVC의 핵심 구성 요소로, 클라이언트의 HTTP 요청을 처리하는 데 중요한 역할을 합니다. 아래에서 DispatcherServlet이 하는 일, 동작 방식, 그리고 별도로 설정이 필요한지에 대해 설명드리겠습니다.1. DispatcherServlet이란 무엇인가?DispatcherServlet은 Spring MVC의 프론트 컨트롤러(Front Controller)로, 모든 클라이언트 요청을 중앙에서 처리하는 .. 공감수 0 댓글수 0 2024. 12. 18.
  • Spring의 컨트롤러, 그리고 전반적인 개념 Q1.기본적으로 Spring 컨트롤러는, 어떤 주소에 대하여 통신요청이 발생했을 때, 해당 주소로 요청된 작업을 처리해주는 것인가? 해당 작업을 처리해주기 위해서는, View에서 특정 작업 처리를 요청하기 위해, 작업 처리를 위해 보내는 데이터들을 받을 URL가 컨트롤러에 맵핑만 되어있으면, 별도의 작업이 없어도, 해당 URL에 맵핑되어 있는 컨트롤러는, 그 URL에 맵핑되어 있는 메소드를 동작시켜서, 필요한 작업을 처리하게 되는 것인가? 만약 내가 한 질문을 대학 교수가 보았을 때, 지적할 것 같은 부분이 있다면 짚어주고 부족한 부분에 대해서도 보완해주었으면 좋겠어.   A1.ChatGPT의 말:네, 질문에서 다루신 내용은 Spring MVC에서 Controller의 기본 동작에 대한 이해를 포함하고 .. 공감수 3 댓글수 2 2024. 12. 18.
  • 클래스와 중첩 클래스 02(+toString) Q1.클래스 안에 있는 클래스를 중복 클래스라고 하는거야?   A1.ChatGPT의 말: 아닙니다! 클래스 안에 선언된 클래스를 **중첩 클래스(Nested Class)**라고 부릅니다. "중복 클래스"라는 용어는 Java에서 공식적으로 사용되지 않습니다.중첩 클래스(Nested Class)란?클래스 내부에 다른 클래스를 선언하는 것을 의미하며, Java에서는 중첩 클래스의 종류를 두 가지로 구분합니다.정적 중첩 클래스 (Static Nested Class)비정적 중첩 클래스 (Inner Class)중첩 클래스의 종류와 특징1. 정적 중첩 클래스 (Static Nested Class)정의: static 키워드로 선언된 클래스입니다.특징:외부 클래스의 객체 생성 없이도 접근할 수 있습니다.외부 클래스의 s.. 공감수 0 댓글수 0 2024. 12. 17.
  • 클래스와 중첩 클래스 01(+Gson +삽질) (!!!주의. item.java 와 rss.java는 어째서인지 내가 만들어낸 쓸데없는 파일이였다...241217 확인됨 ㅠㅠ)  Q1.item 이라는 클래스가 정의되어 있는 item.java 파일에는  (30 Lombok의 item.java 파일 참고)  같이 코드가 작성되어 있고, item이라는 클래스를 안에 품고 있는 클래스  (30 Lombok의 rss.java 파일 참고)  rss 클래스는 이렇게 정의되어 있으며, 이러한 rss 클래스를 품고 있는  (30 Data05.java 파일 참고)  Data05 클래스가 있어. 해당 클래스들을 사용하는 java 파일 (30 App05.java 파일 참고)  이 있고, Filehelper에 정의되어 있는 readString 메소드는  (FileHelper.. 공감수 0 댓글수 1 2024. 12. 17.
    문의안내
    • 티스토리
    • 로그인
    • 고객센터

    티스토리는 카카오에서 사랑을 담아 만듭니다.

    © Kakao Corp.