1. langchain이 무엇일까?

- llm을 직접 호출하고 다양한 방식으로 사용하는 파이프라인을 만들려면 어떻게 해야할까?

- llm으로 특정 애플리케이션과 파이프하인을 만들때 사용하는 프레임워크 중에 하나가 langchain이다.

- 우리가 복잡한 머신러닝 기법을 직접 구현하지 않고 라이브러리를 사용하는 것과 같은 것이라고 생각하면 된다.

 

2. langchain으로 gemini 모델을 사용한 llm 응답 함수를 만들어보자

- 직접 gemini의 sdk를 사용하는 것이 아니라 langchain으로 기능을 만들어보자.

- 시스템 프롬프트는 이전 글에서 사용한 것을 그대로 사용한다.

from langchain_google_genai import GoogleGenerativeAI
from langchain_core.messages import HumanMessage, SystemMessage

GEMINI_API_KEY = '발급받은 gemini api key'

system_prompt = \
"""
1. 답변에는 다른 예시를 추가해서 알려줘야해
수학 연산에 답변을 줬다면 예시처럼 다른 경우도 알려줘
예시1 : 1+4=5야
예시2 : 100+123=223이야
예시3 : 3-1=2야
예시4 : 15/3=5야

2. 너는 학교선생님처럼 친절하게 설명해줘야해.
짧은 답변이 아니라 자세히 친절하게 설명해줘야해.
질문자에게 공부를 잘 할 수 있다는 격려도 해줘야해.

예시1 : 3+3에서 +은 더하기로 앞의 숫자와 뒤의 숫자를 합치는 거야. 다른 케이스도 더 잘 할 수 있을거니 열심히 공부하길 바라
예시2 : 4-3에서 -은 빼기로 앞의 숫자에서 뒤의 숫자 만큼을 줄이는 거야. 다른 연산법도 잘 이해할 수 있도록 내가 잘 알려줄게
"""

model = GoogleGenerativeAI(model="gemini-1.5-flash", google_api_key=GEMINI_API_KEY)

messages = [
    SystemMessage(
        content=system_prompt
    ),
    HumanMessage(
        content="10-3은?"
    )
]

print(model.invoke(messages))

 

- 결과는 이전 글과 동일하게 나온다.

- 이걸 함수로 만든다면 아래와 같이 단순하게 만들 수 있을 것이다.

from langchain_google_genai import GoogleGenerativeAI
from langchain_core.messages import HumanMessage, SystemMessage

system_prompt = \
"""
1. 답변에는 다른 예시를 추가해서 알려줘야해
수학 연산에 답변을 줬다면 예시처럼 다른 경우도 알려줘
예시1 : 1+4=5야
예시2 : 100+123=223이야
예시3 : 3-1=2야
예시4 : 15/3=5야

2. 너는 학교선생님처럼 친절하게 설명해줘야해.
짧은 답변이 아니라 자세히 친절하게 설명해줘야해.
질문자에게 공부를 잘 할 수 있다는 격려도 해줘야해.

예시1 : 3+3에서 +은 더하기로 앞의 숫자와 뒤의 숫자를 합치는 거야. 다른 케이스도 더 잘 할 수 있을거니 열심히 공부하길 바라
예시2 : 4-3에서 -은 빼기로 앞의 숫자에서 뒤의 숫자 만큼을 줄이는 거야. 다른 연산법도 잘 이해할 수 있도록 내가 잘 알려줄게
"""

def inference_message(model=None, human_message=None):
    messages = [
    SystemMessage(
        content=system_prompt
    ),
    HumanMessage(
        content=human_message
    )
    ]
    result = model.invoke(messages)
    return result

 

- 그리고 이 함수를 통해 llm으로 결과를 받으려면 아래와 같이 사용하면 된다.

model = GoogleGenerativeAI(model="gemini-1.5-flash", google_api_key="발급받은 gemini api 키")

result = inference_message(
    model=model,
    human_message="112+34는?"
)

print(result)

 

3. langchain 프레임워크로 간단히 기능을 만들어보자.

- 이미 추상화된 기능을 사용해 llm 기능을 구현하면 편리하게 애플리케이션을 구현할 수 있다.

- 특히 최신 llm 기술에서 사용하는 것도 langchain에서 사용할 수 있기 때문에 langchain을 활용한 개발에 익숙해지자.

1. 시스템 프롬프트란?

- 쉽게 말해서 llm이 특정 명령을 수행할 수 있는 역할을 주는 것이라고 할 수 있다.

- 주로 기본적인 동작방식과 대화의 방식 등을 설정하는데 사용한다.

- api로 결과를 호출할 때 어떤 시스템 프롬프트를 거칠지 설정할 수 있다.

- 이를 파이썬으로 사용하려면 일부 패키지 설치를 통해 쉽게 사용할 수 있다.

- gemini에서는 공식 문서에서 기본적으로 필요한 패키지를 설치하는 과정을 설명해주고 있으니 참고해서 설치해보자.

- https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=python&hl=ko#install_the_python_sdk

 

튜토리얼: Gemini API 시작하기  |  Google AI for Developers

텍스트 생성 및 채팅 기능을 포함하여 Gemini API 및 Gemini 1.5 Flash를 시작합니다.

ai.google.dev

 

 

2. 라이브러리 설치와 단순한 사용 방법

- 아래의 패키지를 설치한다.

- 주피터 노트북을 사용한다면 설치 후 커널을 재실행하자

pip install -q -U google-generativeai

 

- GEMINI_API_KEY에 발급받은 api key를 할당하고, genai.configure에 등록하면 llm에 호출 할 수 있다.

import google.generativeai as genai

GEMINI_API_KEY = "발급받은 gemini api key"
# api key를 설정
genai.configure(api_key=GEMINI_API_KEY)
# 모델 설정
model = genai.GenerativeModel('gemini-1.5-flash')
# 결과 요청
response = model.generate_content("3+3은 뭐야?")
# 결과 확인
print(response.text)

# 결과 : 3 + 3 = 6 입니다.

 

3. 시스템 프롬프트를 설정해서 내가 원하는 방식의 결과를 받아보자.

- 단순히 결과만 나오는 것이 아니라 내가 원하는 추가 설명이 있는 결과를 받도록 설정해보자.

- 아래와 같이 다른 예시를 하나 추가해주고, 학교 선생님처럼 친절하게 설명해달라는 예시를 붙여보자.

system_prompt = \
"""
1. 답변에는 다른 예시를 추가해서 알려줘야해
수학 연산에 답변을 줬다면 예시처럼 다른 경우도 알려줘
예시1 : 1+4=5야
예시2 : 100+123=223이야
예시3 : 3-1=2야
예시4 : 15/3=5야

2. 너는 학교선생님처럼 친절하게 설명해줘야해.
짧은 답변이 아니라 자세히 친절하게 설명해줘야해.
질문자에게 공부를 잘 할 수 있다는 격려도 해줘야해.

예시1 : 3+3에서 +은 더하기로 앞의 숫자와 뒤의 숫자를 합치는 거야. 다른 케이스도 더 잘 할 수 있을거니 열심히 공부하길 바라
예시2 : 4-3에서 -은 빼기로 앞의 숫자에서 뒤의 숫자 만큼을 줄이는 거야. 다른 연산법도 잘 이해할 수 있도록 내가 잘 알려줄게
"""
# 시스템 프롬프트를 모델 설정에 추가
model=genai.GenerativeModel(
  model_name="gemini-1.5-flash",
  system_instruction=system_prompt)

# 결과 요청
response = model.generate_content("100-73은 뭐야?")
# 결과 확인
print(response.text)

 

- 위와 같은 세팅을 통해 아래와 같은 친절하고 예시가 있는 답변을 얻을 수 있다.

안녕하세요! 100 - 73을 계산하는 방법을 알려드릴게요.  '-' 기호는 빼기를 의미하며, 앞의 수에서 뒤의 수를 빼는 연산입니다.

100에서 73을 빼려면,  우리는 자릿수(일의 자리, 십의 자리, 백의 자리)별로 빼기를 해야 합니다.

* **일의 자리:** 0에서 3을 뺄 수 없으므로, 십의 자리에서 10을 빌려와야 합니다.  십의 자리는 0이므로, 백의 자리에서 1을 빌려와 십의 자리를 10으로 만들고, 다시 십의 자리에서 1을 빌려 일의 자리를 10으로 만듭니다. 이제 일의 자리는 10 - 3 = 7이 됩니다.

* **십의 자리:** 십의 자리는 10에서 1을 빌려줬으므로 9가 됩니다.  9에서 7을 빼면 2가 됩니다.

* **백의 자리:** 백의 자리는 100에서 1을 빌려줬으므로 9가 됩니다.  9에서 아무것도 빼지 않으므로 9가 그대로 남습니다.

따라서, 100 - 73 = 27 입니다.

다른 예시를 통해 더 연습해 볼까요?

* **예시 1:** 55 - 22 = ?  (십의 자리와 일의 자리 모두 뺄 수 있으므로, 각 자릿수별로 빼면 됩니다.)
* **예시 2:** 80 - 35 = ? (일의 자리에서 뺄 수 없으므로 십의 자리에서 10을 빌려와야 합니다.)
* **예시 3:** 125 - 48 = ? (백의 자리, 십의 자리, 일의 자리 모두 계산해야 합니다.  자릿수를 잘 나눠서 생각하면 쉽게 풀 수 있어요!)

이러한 연습을 통해 빼기 연산에 대한 이해도를 높일 수 있습니다.  수학은 조금씩 연습하면 누구든 잘 할 수 있어요!  열심히 노력하면 분명 실력이 향상될 거예요.  힘내세요!

 

4. 시스템 프롬프트를 사용하면 좋은 점

- 우리가 원하는 방식으로 답변을 얻을 수 있도록 튜닝할 수 있다.

- 서비스를 만들거나 원하는 결과를 도출하기 위해서는 이런 프롬프팅을 사용해야만 좋은 결과를 얻을 수 있다.

- 일반적으로 우리들이 사용하고 있는 chatGPT도 프롬프팅이 되어 있어서 우리가 편리하게 사용하고 있는 것이다.

- llm을 사용한 서비스를 만들기 위해 시스템 프롬프트를 잘 사용해보자.

1. 구글 gemini 무료로 사용하기

- 하루 마다 사용할 수 있는 요청 수에 제한이 있고, 분당 요청 수도 제한이 있다.

- 가격 정책을 보면 어느 정도 하루에 무료로 사용할 수 있는지 알 수 있다.

- 사용하는 방식은 

- 관련 사용 문서를 보면 api에 특정 요청을 보내는 것으로 간단히 사용할 수 있는 것을 알 수 있다.

- https://ai.google.dev/gemini-api/docs/get-started/tutorial?lang=python&hl=ko#install_the_python_sdk

- https://ai.google.dev/pricing?hl=ko#1_5flash

 

Gemini API 가격 책정  |  Google AI for Developers

개발자를 위한 Gemini API는 확장할 때 강력한 무료 등급과 유연한 가격 책정을 제공합니다.

ai.google.dev

 

튜토리얼: Gemini API 시작하기  |  Google AI for Developers

텍스트 생성 및 채팅 기능을 포함하여 Gemini API 및 Gemini 1.5 Flash를 시작합니다.

ai.google.dev

 

2. 간단히 요청 보내고 확인해보기

- api키를 생성하면 간단히 요청을 보내는 예제를 확인할 수 있다.

- 요청 주소에서 GEMINI_API_KEY 부분을 발급받은 키로 바꾸면 LLM으로 부터 보낸 요청에 대한 답을 받을 수 있다.

- 보내는 요청은 아래에서 "Explain how AI works" 부분이다.

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
  "contents": [{
    "parts":[{"text": "Explain how AI works"}]
    }]
   }'

 

- 요청을 보내면 아래와 비슷한 결과를 볼 수 있다.

- text에 llm으로 생성된 response가 나오는 것을 확인할 수 있다.

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "AI, or Artificial Intelligence, doesn't work in a single, unified way.  Instead, it encompasses a vast range of techniques and approaches, all aiming to mimic human intel .....

1. 어떤 사용 예시가 있을까?

- 클래스를 만들면 동일하거나 비슷한 속성의 객체를 쉽게 관리할 수 있다.

- 예를 들어 카드의 전투력과 방어력이 변동하고 해당 값으로 승패를 가르는 게임이 있다면 쉽게 사용할 수 있을 것이다.

 

 

2. 카드 게임에 사용할 기본 클래스를 구현해보자

- 아래와 같이 구현해보자

class BattleCard:
    def __init__(self, name, attack, defense):
        self.name = name
        self.attack = attack
        self.defense = defense

    def __repr__(self):
        return f"BattleCard('{self.name}', {self.attack}, {self.defense})"
    
    def __getitem__(self, key):
        if key == 'name':
            return self.name
        elif key == 'attack':
            return self.attack
        elif key == 'defense':
            return self.defense
        else:
            raise KeyError(f"Invalid key: {key}")

# wave_card: BattleCard('훌라댄서 웨이브', 10, 5)
# wave_card['name']: 훌라댄서 웨이브
# wave_card['attack']: 10
# wave_card['defense']: 5
# --------------------------------
# surf_card: BattleCard('먹부림 대장 서프', 4, 9)
# surf_card['name']: 먹부림 대장 서프
# surf_card['attack']: 4
# surf_card['defense']: 9

- 그러면 아래와 같이 데이터를 각 카드의 속성을 확인할 수 있다.

wave_card = BattleCard(name="훌라댄서 웨이브", attack=10, defense=5)
surf_card = BattleCard(name="먹부림 대장 서프", attack=4, defense=9)

print(f"wave_card: {wave_card}")
print(f"wave_card['name']: {wave_card['name']}")
print(f"wave_card['attack']: {wave_card['attack']}")
print(f"wave_card['defense']: {wave_card['defense']}")
print("--------------------------------")
print(f"surf_card: {surf_card}")
print(f"surf_card['name']: {surf_card['name']}")
print(f"surf_card['attack']: {surf_card['attack']}")
print(f"surf_card['defense']: {surf_card['defense']}")

- 그렇다면 카드끼리 싸우는 함수를 통해 한 번의 싸움마다 카드의 승패를 확인할 수 있다.

def battle_result(player1_card, player2_card):
    player1_card_defense_status_after_battle = player1_card['defense'] - player2_card['attack']
    player2_card_defense_status_after_battle = player2_card['defense'] - player1_card['attack']
    
    if player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle <= 0:
        return "두 카드가 모두 파괴되어 무승부입니다.."
    elif player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle > 0:
        return f"{player1_card['name']} 패배했습니다."
    elif player1_card_defense_status_after_battle > 0 and player2_card_defense_status_after_battle <= 0:
        return f"{player2_card['name']} 패배했습니다."
    else:
        return "두 카드가 모두 살아있습니다."
        

battle_result(wave_card, surf_card)
# '먹부림 대장 서프 패배했습니다.'

- 하지만 만약 무승부로 끝나서 이어서 대결을 해야한다면??

- 그렇다면 인스턴스의 값을 변경하고 다시 대결을 하는 과정이 필요하다.

- 따라서 인스턴스의 값을 변경시킬 수 있는 특별 메서드를 추가한다.

 

 

3. 값을 변경할 수 있도록 바꾸고 배틀 함수를 변경해보자

- __setitem__을 추가해보자

class BattleCard:
    def __init__(self, name, attack, defense):
        self.name = name
        self.attack = attack
        self.defense = defense

    def __repr__(self):
        return f"BattleCard('{self.name}', {self.attack}, {self.defense})"
    
    def __getitem__(self, key):
        if key == 'name':
            return self.name
        elif key == 'attack':
            return self.attack
        elif key == 'defense':
            return self.defense
        else:
            raise KeyError(f"Invalid key: {key}")
    
    def __setitem__(self, key, value):
        if key == 'name':
            self.name = value
        elif key == 'attack':
            self.attack = value
        elif key == 'defense':
            self.defense = value
        else:
            raise KeyError(f"Invalid key: {key}")

- 그리고 배틀 함수에서 변경된 defence의 값을 적용하고 결과로 출력한다.

- 또한 배틀 후의 결과를 출력하는 함수와 배틀을 하는 함수로 분할해서 함수를 관리한다.

def cards_status_after_battle(player1_card, player2_card):
    player1_card_defense_status_after_battle = player1_card['defense'] - player2_card['attack']
    player2_card_defense_status_after_battle = player2_card['defense'] - player1_card['attack']
    player1_card['defense'] = player1_card_defense_status_after_battle
    player2_card['defense'] = player2_card_defense_status_after_battle
    return player1_card, player2_card
    
def battle_result(player1_card, player2_card):
    player1_card_defense_status_after_battle = player1_card['defense']
    player2_card_defense_status_after_battle = player2_card['defense']
    
    if player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle <= 0:
        return "두 카드가 모두 파괴되어 무승부입니다.."
    elif player1_card_defense_status_after_battle <= 0 and player2_card_defense_status_after_battle > 0:
        return f"{player1_card['name']} 패배했습니다."
    elif player1_card_defense_status_after_battle > 0 and player2_card_defense_status_after_battle <= 0:
        return f"{player2_card['name']} 패배했습니다."
    else:
        return "두 카드가 모두 살아있습니다."


player1_card, player2_card = cards_status_after_battle(wave_card, surf_card)
print(battle_result(player1_card, player2_card))
print(player1_card)
print(player2_card)

# 먹부림 대장 서프 패배했습니다.
# BattleCard('훌라댄서 웨이브', 10, 1)
# BattleCard('먹부림 대장 서프', 4, -1)

 

'개발 공부 > Python' 카테고리의 다른 글

1. 특별 메서드의 기본적인 사용  (0) 2025.01.09

1. 특별 메서드?

- 클래스에 특정한 동작을 부여하기 위해 사용되는 방법이다.

- 더하기, 빼기, 길이 출력 등 쉽게 코드로 구현할 수 있는 기능을 제공한다.

- 하지만 특별 메서드를 사용하면 추가적인 구현이 없어도 되고, 클래스의 기능 구성이 간결해진다.

 

2. 예시를 통해 알아보자

class NumberList:
    def __init__(self, initial_data=None):
        self.data = initial_data
    
    def __getitem__(self, index):
        return self.data[index]
    
    def __len__(self):
        return len(self.data)
    
    def __repr__(self):
        return f"NumberList({self.data})"


- 위의 클래스를 아래와 같이 실행하면 주석으로 달아둔 결과를 얻을 수 있다.

my_list = NumberList([1, 2, 3, 4, 5])

print(f"3번째 숫자: {my_list[3]}")
print(f"나의 리스트 길이 : {len(my_list)}")
print(f"나의 리스트 문자열: {my_list}")

# 출력 결과
# 3번째 숫자: 4
# 나의 리스트 길이 : 5
# 나의 리스트 문자열: NumberList([1, 2, 3, 4, 5])

1. 변수의 타입

- 변수는 크게 기본형과 참조형이 있다.

  • 기본형 : boolean, char, byte, short, int, long, float, double로 계산을 위한 실제 값을 저장하는 형식
  • 참조형 : 어떤 값이 저장되어 있는 메모리 주소를 저장. 기본형을 제외한 모든 형식

- 참조형 변수를 선언할때는 변수의 타입으로 클래스의 이름을 사용한다.

Date today = new Date(); // Date객체를 생성하고 today에 그 주소를 저장한다.

 

 

 

2. 기본형

- 기본형은 크게 4가지로 구분할 수 있다.

  • 논리형
    • boolean : true, false로 논리식 계산에 사용
  • 문자형
    • char : 문자를 저장하는데 사용
  • 정수형
    • byte, short, int, long : 정수를 저장하는데 사용. 주로 int를 사용하고 byte는 2진수, short는 C언어와 호환을 위해 사용한다.
  • 실수형
    • float, double : 실수를 저장하는데 사용. 주로 double이 사용된다.

- boolean은 다른 기본형과 변환과 연산이 불가능 하다.

- 다른 기본형은 서로 변환과 연산이 가능하다.

- 정수형이나 실수형은 사용할 값의 범위에 차이가 있는 것이므로 확인후 사용하자.

- 주로 boolean, char, int, double을 사용한다고 생각하면 된다.

 

 

 

3. 상수

- 상수는 일반 변수와 같은 방식으로 선언할 수 있지만, 그 값을 변경할 수 없다.

- 상수를 선언하는 방법은 변수 타입 앞에 final을 붙이면 된다.

- 상수는 반드시 선언과 동시에 초기화해야하고, 그 이후에는 값 변경이 불가능 하다.

class ConstantEx1 {
    public static void main(String[] args) {
        // 아래의 주석을 해제하고 실행하면 선언만 해서 에러가 발생하는 것을 볼 수 있다.
        // final int MY_CONSTANT;
        final int MY_CONSTANT = 100;
        System.out.println(MY_CONSTANT);
        
        // 아래의 주석을 해제하고 실행하면 MY_CONSTANT를 변경할 수 없다는 에러가 발생한다.
        // MY_CONSTANT = 200;
    }
}

 

 

 

4. 리터럴

- 변수가 가지고 있는 값 자체를 말하는 것이 리터럴이다.

- 예를 들면 final MY_NUM = 100; 의 리터럴은 100이다.

- 리터럴에는 접미사를 붙여서 구분한다.

class Literal {
    public static void main(String[] args) {
        int myInt = 100;
        long myLong = 100L;
        // _을 구분자로 사용할 수 있다. 결론적으로 100000000이 할당된다.
        long myLong2 = 100_000_000L;

        float myFloat = 1.23f;
        double myDouble = 1.23d;
        // d는 생략할 수 있다.
        double myDouble2 = 1.23;

        System.out.println(myLong2);
    }
}

 

1. 변수란?

- 단 하나의 값을 저장할 수 있는 메모리 공간

- 변수타입과 변수 이름을 작성하여 변수를 선언한다.

- 선언한 변수에 값을 넣어서 초기화 한다.

// 변수 선언과 초기화
int var1;
int var1 = 20;

// 타입이 같은 변수는 한 줄에 선언과 초기화를 할 수 있다
int var2, var3;
int var2 = 30, var3 = 35;

// 선언과 초기화를 동시에 할 수도 있다.
int var4 = 100;
int var5 = 300;

 

 

 

2. 변수 선언과 초기화

- 변수에 값을 저장하고 읽어오는 예제는 아래와 같다.

- 변수의 값이 int이므로 사칙연산의 결과가 변수가 할당된다.

class VarEx1 {
    public static void main(String[] args) {
        int year = 2022;
        int month = 8;

        System.out.println(year);
        System.out.println(month);
        
        year = year + 1000;
        month = year - 2000;
       
        System.out.println(year);
        System.out.println(month);
    }
}

 

 

 

3. 변수의 교환

- 이미 값이 할당된 변수에 다른 변수를 할당하면 다른 변수의 값이 할당된다.

class VarEx2 {
    public static void main(String[] args) {
        int var1 = 10;
        int var2 = 20;
        var2 = var1;
		
        // ""에 문자열을 적어서 출력할 수 있고, +를 사용해 변수와 합쳐서 결합된 문자열을 만들 수 있다.
        System.out.println("var1 :"+var1+", var2 :"+var2);

        var1 = 10;
        var2 = 20;
        int tmp = 30;
        var2 = tmp;

        System.out.println("var1 : "+var1+", var2 :"+var2);
    }
}

 

 

4. 변수의 명명 규칙

- 대소문자가 구분되어야하고 길이에 제한이 없다.

- 예약어는 사용해서는 안된다(if 등등)

- 숫자로 시작할 수 없다.

- 특수문자는 _와 $만 허용한다.

 

 

 

5. 그 외에 지키면 좋을 규칙

- 클래스의 이름의 첫 글자는 항상 대문자로 한다.

- 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.

- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다(lastIndex, StringBuffer)

- 상수의 이름은 모두 대문자로 한다, 여러 단어로 이루어진 경우 _로 구분한다(PI, MAX_NUM)

 

1. 시작은 'Hello, World.'

- Hello, World가 출력되는 프로그램을 작성해본다.

- Hello.java를 작성 -> javac.exe가 컴파일 -> Hello.class 생성 -> java.exe가 실행 -> 'Hello, World.'가 출력되는 방식으로 프로그램이 만들어진다.

 

 

 

2. 클래스 작성

- 자바에서 모든 코드는 클래스 안에 작성되어야한다.

- class 다음에 클래스 이름을 적고 {} 안에 코드를 작성한다.

- 주석은 한 줄에는 //, 여러 줄에는 /* 주석내용 */을 사용한다.

- 자바에서는 public static void main (String[] args)을 항상 선언해야한다.

- 아래와 같이 간단한 프로그램으로 위 내용을 확인해보자.

class Hello {
    public static void main(String[] args) {
        // 이건 한 줄 주석
    /* 이건
       여러줄
       주석 */
        System.out.println("Hello, world.");
    }
}

 

 

 

3. 클래스 파일 작성 시 주의점

- public 클래스와 파일 이름이 동일해야 한다.

- public 클래스가 없는 경우 어떤 클래스로도 이름을 정할 수 있다.

- public 2개가 한 파일에 존재할 수 없다.

- public 클래스의 이름은 대소문자도 구분해야한다.

1. 파이썬을 하고 있는데 자바를 시작하는 이유?

- 서점에서 우연히 Java의 정석이라는 책을 보게 되었다.

- 처음 내용부터 찬찬히 보니 프로그래밍에 대한 기본적인 내용부터 다시 살펴볼 수 있을 것 같았다.

- 이걸 파이썬으로 한다면 아마 알고 있는 거라고 쉽게쉽게 넘어갈 것 같아서 다른 언어를 골랐다.

- 다른 언어를 경험해보기도 하면서 백엔드에서 여전히 많이 쓰이는 자바를 알아두면 좋을 것 같았다.

 

 

 

2. 사용할 자료와 공부 방식은?

- Java의 정석 3rd Edition을 보기로 했다.

- 최대한 하루에 조금씩이라도 내용을 블로그에 내용을 남기는 습관을 가지려고 한다.

- 이미 다른 언어를 어느 정도 알고 있다는 가정하에 아주 간단히 내용만 기록한다.

- 아무튼 시작!

+ Recent posts