1. 표준화(Standardization)란?

데이터 분석이나 머신러닝에서 변수의 단위가 다를 때(예: cm, kg 등)
모델이 특정 변수에 과도하게 영향을 받지 않도록 데이터를 일정한 기준으로 맞추는 과정을 말합니다.

표준화는 각 변수의 데이터를 평균 0, 표준편차 1로 변환합니다.

수식으로는 다음과 같습니다.

 

 

  • μ 평균(mean)
  • σ: 표준편차(standard deviation

2. (분류)Ex01 - 코드 예제

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 1) 예시 데이터 생성
data = {
    'height' : [160,165,170,175,180],
    'weight' : [55,60,65,70,75]
}

df = pd.DataFrame(data)
print(df)

# 2) StandardScaler 객체 생성
scaler = StandardScaler()

# 3) 표준화 학습 (fit)
scaler.fit(df)

# 4) 표준화 변환 (transform)
x_scale = scaler.transform(df) # 방법 1: fit → transform
x2_scaler = scaler.fit_transform(df) # 방법 2: fit_transform 한 번에 수행

# 5) 결과 출력
print(scaler.mean_)   # 각 변수의 평균
print(scaler.scale_)  # 각 변수의 모표준편차(모집단 표준편차)

print(df.mean())                       # 원본 평균
print("모표준편차 : ", df.std(ddof=0)) # 모집단 표준편차
print("표본 표준편차 : ", df.std(ddof=1)) # 표본 표준편차

print(f"표준화 평균 : {x_scale.mean()}")
print(f"표준화 표준편차1 : {x_scale.std()}")
print(f"표준화 표준편차2 : {x_scale.std(ddof=0)}")
print(f"표준화 표준편차3 : {x_scale.std(ddof=1)}")

 

 

3. 실행 결과 예시

   height  weight
0     160      55
1     165      60
2     170      65
3     175      70
4     180      75

scaler.mean_ : [170.  65.]
scaler.scale_ : [7.07106781 7.07106781]

원본 평균
height    170.0
weight     65.0
dtype: float64

모표준편차 : 
height    7.071068
weight    7.071068
dtype: float64

표본 표준편차 : 
height    7.905694
weight    7.905694
dtype: float64

표준화 평균 : 0.0
표준화 표준편차1 : 1.0
표준화 표준편차2 : 1.0
표준화 표준편차3 : 1.118033988749895

 

 

4. 주요 개념 정리

구분  설명   
평균(mean) 각 열의 평균값 scaler.mean_, df.mean()
모표준편차(σ) 모집단 기준 표준편차 (ddof=0) scaler.scale_, df.std(ddof=0)
표본표준편차(s) 표본 기준 표준편차 (ddof=1) df.std(ddof=1)
표준화 결과 평균이 0, 표준편차가 1로 변환된 데이터 x_scale

5. fit, transform, fit_transform 차이

메서드  설명
fit() 데이터의 평균과 표준편차를 계산하여 저장
transform() 저장된 평균과 표준편차로 실제 변환 수행
fit_transform() 두 과정을 한 번에 수행

 


6. 정리

  • 표준화는 머신러닝에서 매우 중요한 전처리 과정입니다.
  • 평균 0, 표준편차 1로 맞추어 모델이 특정 변수에 치우치지 않도록 만듭니다.
  • StandardScaler는 모집단 표준편차(ddof=0) 를 기준으로 계산합니다.
  • 변환된 데이터는 항상 평균이 0, 표준편차가 1에 가깝게 됩니다.

1. 다중회귀란?

다중회귀(Multiple Linear Regression) 는 두 개 이상의 독립변수(X₁, X₂, …)를 사용해
하나의 종속변수(Y)를 예측하는 회귀모델이다.

 

일반식

y=w1x1+w2x2++b

  • wi: 각 독립변수의 기울기(회귀계수, weight)
  • : 절편(intercept)
  • : 종속변수(예측 대상)

2. Ex06 ― 두 개의 변수로 예측하기

from sklearn.linear_model import LinearRegression
import numpy as np

x = np.array([
    [0, 1],
    [5, 1],
    [15, 2],
    [25, 5],
    [35, 11],
    [45, 15],
    [55, 34],
    [60, 35]
])
y = np.array([4, 5, 20, 14, 32, 22, 38, 43])

model = LinearRegression()
model.fit(x, y)

 

print("기울기:", model.coef_)      # 각 독립변수의 가중치
print("절편:", model.intercept_)

 

회귀식

y=w1​x1​+w2​x2​+b

 

결정계수(R²) 계산

: 모델의 설명력을 나타내는 지표로,
1에 가까울수록 데이터의 변동을 잘 설명한다

from sklearn.metrics import r2_score

# 직접 계산
RSS = np.sum((y - model.predict(x)) ** 2)   # 오차제곱합
TSS = np.sum((y - np.mean(y)) ** 2)         # 전체변동합
R2_manual = 1 - (RSS / TSS)

# 함수 사용
R2 = r2_score(y, model.predict(x))
print("결정계수(R²):", R2)

 

새로운 데이터 예측

x_test = np.array([[6,5],[8,6],[5,7]])
pred = model.predict(x_test)
print("예측 결과:", pred)

3. Ex07_MSE_RMSE ― 회귀모델의 성능 평가 지표

data = {
    'study_time': [2, 3, 4, 5, 6, 8, 10, 12],
    'sleep_time': [9, 8, 8, 7, 6, 6, 5, 5],
    'phone_time': [5, 5, 4, 4, 3, 2, 2, 1],
    'score': [50, 55, 60, 65, 70, 75, 85, 88]
}

 

  • 독립변수(X): 공부시간, 수면시간, 휴대폰 사용시간
  • 종속변수(y): 시험 점수

모델 학습

df = pd.DataFrame(data)
x = df.drop('score', axis=1)
y = df['score']

model = LinearRegression()
model.fit(x, y)

 

 

회귀계수 및 절편

print("기울기:", model.coef_)
print("절편:", model.intercept_)

 

모델 평가: R², MSE, RMSE

from sklearn.metrics import mean_squared_error, r2_score
y_pred = model.predict(x)

# 결정계수 R²
r2 = r2_score(y, y_pred)

# 평균제곱오차 (MSE)
MSE = mean_squared_error(y, y_pred)

# 제곱근평균제곱오차 (RMSE)
RMSE = np.sqrt(MSE)

 

 

지표  의미  값이 클수록 / 작을수록
설명력 (모델이 데이터를 얼마나 잘 설명하는가) 클수록 좋음
MSE 예측오차 제곱의 평균 작을수록 좋음
RMSE 제곱근 취한 오차 평균 (원래 단위) 작을수록 좋음

 

예측 테스트

x_test = pd.DataFrame(
    [[6,7,2],[4,8,4],[10,5,1]],
    columns=['study_time', 'sleep_time', 'phone_time']
)
print(model.predict(x_test))

4. Ex08.py ― 실제 부동산 데이터에 적용하기

데이터 전처리

df = pd.read_csv("서울시 부동산 실거래가 정보.csv", encoding="UTF-8")
df = df.dropna()
x = df[['건물면적(㎡)', '층', '건축년도']]
y = df['물건금액(만원)']

 

학습 및 예측

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(x_train, y_train)

 

회귀식 출력

coef = model.coef_
intercept = model.intercept_
print(f"회귀식: y = {coef[0]:.2f}*건물면적 + {coef[1]:.2f}*층 + {coef[2]:.4f}*건축년도 + ({intercept:.2f})")

 

결정계수 비교

from sklearn.metrics import r2_score
train_R2 = r2_score(y_train, model.predict(x_train))
test_R2 = model.score(x_test, y_test)
print(f"train_R2 : {train_R2}")
print(f"test_R2 : {test_R2}")

 

예측 예시

arr = pd.DataFrame([[84, 5, 2010]], columns=['건물면적(㎡)', '층', '건축년도'])
pred_arr = model.predict(arr)
print(f"예상 가격: {pred_arr[0]:.2f} 만원")

 

5. 요약

결정계수 모델의 설명력 1에 가까울수록 좋음
MSE 평균제곱오차 예측오차의 제곱평균 작을수록 정확
RMSE 제곱근평균제곱오차 실제 단위로 환산된 오차 작을수록 성능 좋음
coef_ 회귀계수 변수의 영향력 +면 양의 상관, -면 음의 상관

6. 정리 포인트

  • 단일회귀 → 다중회귀로 확장 시 변수 간 상호작용을 더 잘 설명할 수 있다.
  • 오차(MSE, RMSE)는 모델의 예측 성능 평가의 핵심 지표이다.
  • 실제 데이터 적용 시 결측치 처리(dropna)와 데이터 전처리가 중요하다.
  • 결정계수(R²)는 높을수록 모델이 데이터를 잘 설명한다.

1. 선형회귀 기본 개념

선형회귀(Linear Regression)
입력 변수 x와 출력 변수 y의 관계를 직선(line) 으로 근사하는 통계적 방법

 

y=ax+b

 

항목 의미
a 기울기 (slope, 회귀계수)
b 절편 (intercept, y절편)
y 예측값 (predicted value)

 

 

2. Ex03 - 단순선형회귀 코드 예제

from sklearn.linear_model import LinearRegression
from matplotlib import pyplot as plt
import numpy as np
plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False

# 학습용 데이터
x = np.array([50, 60, 70, 80, 90, 100, 110])
y = np.array([150, 180, 200, 220, 240, 260, 300])

model = LinearRegression()
X = x.reshape(-1, 1)
model.fit(X, y)

# 기울기와 절편 출력
coef = model.coef_[0]
intercept = model.intercept_
print(f"기울기 :{coef}\n절편 : {intercept}")

# y예측값
y_pred = model.predict(X)
print(f"y예측값(y_pred):\n{y_pred}")

# 결정계수
from sklearn.metrics import r2_score
r2 = r2_score(y, y_pred)
print(f"결정계수(r2) : {r2_score(y, y_pred)}")

RSS = np.sum((y - y_pred) ** 2) # 실제값 - 예측값
TSS = np.sum((y - np.mean(y)) ** 2) # 실제값 - 평균값
R2 = 1 - (RSS / TSS)
print(f"R² : {R2:.4f}")


# 그래프 시각화
plt.scatter(x, y, label="실제 데이터")
plt.grid(True, linestyle='--', alpha=0.6)
plt.plot(x, y_pred, color='red', alpha=0.5,  label=f"회귀선: y = {coef:.2f}x + {intercept:.2f}\nR2={r2:.3f}")
plt.xlabel("집 크기")
plt.ylabel("집 가격")
plt.legend()
plt.show()

테스트 데이터 예측

: 새로운 입력 값(집 크기)을 넣어 예측

# 새로운 테스트 데이터
arr = np.array([55, 75, 95, 105]).reshape(-1, 1)
pred = model.predict(arr)

# 예측 결과 출력
for i in range(len(arr)):
    print(f"{arr[i][0]}㎡ → 예측 가격: {pred[i]:.2f}만원")
출력 예시
55㎡ → 예측 가격: 165.71만원
75㎡ → 예측 가격: 191.86만원
95㎡ → 예측 가격: 218.00만원
105㎡ → 예측 가격: 231.57만원

 

 


 

3. Ex05 - 훈련 데이터와 테스트 데이터로 선형회귀 성능 평가 (train_test_split)

선형회귀(Linear Regression) 는 데이터를 기반으로
입력(x)과 출력(y) 사이의 선형 관계를 찾아내는 모델이다.

하지만 모든 데이터를 학습에 사용하면 과적합(Overfitting) 위험이 있다.
→ 따라서 데이터를 훈련용(Train)테스트용(Test) 으로 분리하여 모델의 일반화 능력을 확인

 

데이터 구분 설명
훈련 데이터 (train) 모델 학습에 사용
테스트 데이터 (test) 학습 후 성능 검증에 사용

 

 

전체 코드

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False

# 1) 데이터 준비
x = np.array([50, 60, 70, 80, 90, 100, 110])
y = np.array([150, 180, 200, 220, 240, 260, 300])

# sklearn은 입력값을 2차원 형태로 받아야 함
x = x.reshape(-1, 1)

# 2) 데이터 분리 (훈련 70%, 테스트 30%)
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.3, random_state=42
)

# 3) 모델 생성 및 학습
model = LinearRegression()
model.fit(x_train, y_train)

# 4) 기울기와 절편 출력
coef = model.coef_[0]       # 기울기
intercept = model.intercept_ # 절편
print(f"기울기 : {coef}")
print(f"절편 : {intercept}")

# 5) 테스트 데이터 예측
y_test_pred = model.predict(x_test)

# 6) 결정계수 (R²)
r2_test = r2_score(y_test, y_test_pred)
print(f"테스트데이터 결정계수(R²) : {r2_test:.4f}")

# 7) 시각화
plt.scatter(x_train, y_train, color='blue', label='훈련 데이터')
plt.scatter(x_test, y_test, color='orange', label='테스트 데이터')
plt.plot(x, model.predict(x), color='red',
         label=f"회귀선 (R²={r2_test:.3f})")

plt.title('선형 회귀 : 훈련/테스트 데이터 비교')
plt.xlabel('집 크기')
plt.ylabel('집 가격')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

결과 해석

 

항목  의미
기울기(a) x가 1 증가할 때 y가 약 2.51 증가
절편(b) x=0일 때 예측된 y값 (약 20)
결정계수(R²) 모델이 테스트 데이터의 변동을 약 99.7% 설명

 

시각화 설명

 

  • 파란색 점: 훈련 데이터 (train)
  • 주황색 점: 테스트 데이터 (test)
  • 빨간선: 학습된 회귀선

 


4. 결정계수(R²)란?

결정계수(R²)는 모델의 설명력을 나타내는 지표로,
1에 가까울수록 실제값과 예측값이 잘 일치함을 의미

 

 

R2 = 1TSS / RSS

 

 

기호  의미
RSS (Residual Sum of Squares) 잔차 제곱합 — 예측오차
TSS (Total Sum of Squares) 전체 제곱합 — 데이터 전체 변동성
설명력 (0~1 사이 값)

 

🔽TSS와 RSS (접은글)

더보기

1) TSS (Total Sum of Squares, 전체 제곱합)

 

 

2) RSS (Residual Sum of Squares, 잔차 제곱합)

 

 


5. 핵심 포인트 정리

  • train_test_split()으로 데이터를 나누어 일반화 성능 확인
  • r2_score()는 예측 정확도를 수치로 평가 (1에 가까울수록 좋음)
  • LinearRegression().fit(X, y) → 학습
  • model.predict() → 예측
  • 훈련데이터 R²테스트데이터 R²를 비교해 과적합 여부 판단

Pandas 완전 기초 정리 (Ex01~Ex09)

데이터분석 필수 라이브러리 Pandas
시리즈(Series) → 데이터프레임(DataFrame) → CSV 입출력 → 그룹연산 → 병합까지 완성형 튜토리얼

 

 

1️⃣ Series (Ex01_Series.py)

: Series는 1차원 형태의 데이터 구조로, 리스트(list)와 비슷하지만
각 값에 인덱스(index) 를 부여해 이름으로 데이터를 제어

import pandas as pd
import numpy as np

# 기본 Series
s1 = pd.Series([10, 20, 30, 40, 50])
print(s1)

# 인덱스 지정
s1 = pd.Series([10, 20, 30, 40, 50], index=['정륜', '춘배', '애옹', '김정륜', '김애옹'])
print(s1["춘배"])  # 20
print(s1.values)
print(s1.index)

# 값 수정 / 추가
s1["춘배"] = 50
s1["나비"] = 70

# 조건 필터링
print(s1[s1 >= 40])
print(s1[(s1 >= 40) & (s1 <= 60)])

# 사전 → Series
d = {"서울":2000, "부산":3000, "울산":7000, "광주":5000}
s2 = pd.Series(d)

# NaN 처리
s3 = pd.Series(d, index=['부산','울산','목포','서울'])
print(pd.isna(s3))
print(pd.notna(s3))

# Drop, Sort 예시
s1 = pd.Series([10,20,30,40,50,60,70], index=list('abcdefg'))
print(s1.drop(['a','b']))
print(s1.sort_index())
print(s1.sort_values(ascending=False))

2️⃣ Series 연습 & 기초 통계 (Ex02.py)

import pandas as pd
import numpy as np

score = pd.Series([100, 200, 300, 400], index=['국어','영어','수학','과학'])
score['과학'] = 450
score['미술'] = 250

# 조건 필터링
print(score[score >= 300])
print(score[(200 <= score) & (score <= 400)])

# 정렬
print(score.sort_index())
print(score.sort_values(ascending=False))

# reindex
subject = ['국어','영어','체육']
s2 = score.reindex(subject, fill_value=0)

# 통계
print(np.max(score), np.min(score), np.mean(score), np.sum(score))

 


 3️⃣ DataFrame 생성과 조작 (Ex03_DataFrame_생성.py)

: DataFrame은 엑셀의 표와 같은 2차원 구조입니다.
즉, 여러 개의 Series를 모은 형태로 행과 열이 존재

import pandas as pd
import numpy as np

# 리스트, 딕셔너리, 시리즈 모두 생성 가능
d = {
    "이름":['윤아','민호','혜수','찬열','소영'],
    "부서":['영업','개발','개발','영업','인사'],
    "급여":[5000,6000,5500,5800,4800],
    "근속연수":[2,5,3,5,1]
}

df = pd.DataFrame(d)
df["연봉"] = df["급여"] * 12
df["상여금"] = pd.Series([300,500,400,450,200], index=range(5))
df["총연봉"] = df["연봉"] + df["상여금"]
df["비율(상여금/급여)"] = (df["상여금"]/df["급여"]).round(2)

# 행/열 삭제
df_drop = df.drop(["근속연수"], axis=1)
df_reindex = df.reindex(columns=['이름','급여','부서'])

 

4️⃣ 데이터 관리 실습 (Ex04.py)

import pandas as pd

d = {
  "도서명":["파이썬 입문","데이터 사이언스","머신러닝 완벽 가이드","딥러닝 실습","웹 개발 기본"],
  "저자":["김철수","이영희","박민수","정소영","최민호"],
  "출판연도":[2018,2020,2019,2021,2017],
  "가격":[30000,45000,50000,55000,35000],
  "판매부수":[1500,1200,800,600,2000]
}
df = pd.DataFrame(d)
df["카테고리"] = ['프로그래밍','데이터','AI','AI','웹']
df["총매출"] = df["가격"] * df["판매부수"]
df_2019 = df[df["출판연도"]>=2019]
df_sort = df.sort_values(by="가격", ascending=False).head(3)

5️⃣ CSV 파일 입출력 (Ex05_csv.py)

import pandas as pd

data = [('유재석',50),('송은이',30)]
df = pd.DataFrame(data, columns=['이름','나이'])

# CSV 저장
df.to_csv('result.csv', encoding='utf-8', index=False)

# CSV 불러오기
df_read = pd.read_csv('result.csv', encoding='utf-8')

6️⃣ 결측값 처리 (Ex06.py)

df = pd.read_csv('read.csv', encoding='utf-8', index_col=0, header=0)

print(df.isna())  # 결측값 확인
print(df.dropna())  # 결측행 제거
df = df.fillna({'kor':22, 'eng':30})  # 값 대체

 

isna() / notna() 결측값 확인
dropna() 결측행 제거
fillna() 결측값 채우기

7️⃣ 그룹 연산 (Ex07.py) - groupby()

df = pd.read_csv('capital_area.csv', sep='|', header=None)
my_group = df.groupby('영업소코드')['총교통량'].sum()
print(my_group)

# 집계
df_agg = df.groupby('영업소코드')[['1종교통량','2종교통량']].agg(['max','min'])
# 필터링
df_cond = df[(df["영업소코드"]==190) & (df["입출구구분코드"]==1)]

 

8️⃣ 그룹 통계 실습 (Ex08.py)

df = pd.read_csv('movies.csv')

df1 = df.groupby('장르')['평점'].mean()
df2 = df.groupby('감독')['관객수(만)'].sum()
df3 = df.groupby('장르').agg({"평점":"mean","관객수(만)":"sum"})
df4 = df.groupby(['감독','장르'])[['평점','관객수(만)']].mean()

 

9️⃣ 데이터 병합 (Ex09.py)

import pandas as pd

df1 = pd.DataFrame({'고객번호':[1001,1002,1003],'이름':['윤아','수영','서현']})
df2 = pd.DataFrame({'고객번호':[1001,1002,1004],'금액':[10000,20000,5000]})

# 기본 병합(inner)
pd.merge(df1, df2, how='inner', on='고객번호')

# outer / left / right
pd.merge(df1, df2, how='outer')
pd.merge(df1, df2, how='left')
pd.merge(df1, df2, how='right')

1. 배열(array) 기본 구조와 속성 (Ex01.py)

import numpy as np

# 스칼라(단일값)
a = 100
print(a, type(a))

# 리스트
b = [1,2,3,4]
print(b, type(b), len(b), sum(b))

# 2차원 리스트
c = [[1,2,3,4],[5,6,7,8]]
for i in range(len(c)):
    for j in range(len(c[i])):
        print(c[i][j], end="")
    print()

# numpy 배열
d = np.array(200)
print(d, type(d))

# 1차원 배열
e = np.array([1,2,3])
print(f"e:{e}, 차원:{e.ndim}")

# 2차원 배열
f = np.array([[1,2,3,4],[5,6,7,8]])
print(f"shape:{f.shape}, ndim:{f.ndim}, size:{f.size}")

# 1행 4열 구조
g = np.array([[1,2,3,4]])
print(f"shape:{g.shape}, dtype:{g.dtype}, itemsize:{g.itemsize}")

 

속성 의미
ndim 배열의 차원 수
shape 배열의 형태(행, 열)
size 전체 원소 개수
dtype 데이터 타입
itemsize 원소 하나의 바이트 크기

 2. 배열 연산과 행렬 곱 (Ex02.py)

import numpy as np

a = np.array([-1,3,2,6])
b = np.array([3,6,1,2])

print(a+b)
print(a*b)
print(np.matmul(a,b))  # 내적(dot product)

# 2x2 형태로 변환
A = a.reshape([2,2])
B = b.reshape([2,2])

print(f"A+B:\n{A+B}")
print(f"A*B:\n{A*B}")
print(f"행렬곱(A×B):\n{np.matmul(A,B)}")

# 전치행렬
print(A.T)
  • * : 원소별 곱(element-wise)
  • np.matmul() : 행렬 곱 (수학적 dot 연산)
  • reshape() : 배열 형태 변경
  • T : 전치행렬 (행↔열 변환)

3. 배열 생성 함수 (Ex03.py)

import numpy as np

print(np.arange(5))        # 0~4
print(np.arange(20, 7, -1)) # 20→8까지 역순

d = np.arange(6).reshape(2,3)
print(f"d.shape:{d.shape}, ndim:{d.ndim}")

# 기초 배열 생성
print(np.zeros((2,3)))   # 0으로 채움
print(np.ones((2,3)))    # 1로 채움
print(np.full((2,3),7))  # 7로 채움
print(np.eye(3))         # 단위행렬
함수 설명
arange(start, stop, step) 범위 기반 배열 생성
zeros(shape) 0으로 채워진 배열
ones(shape) 1로 채워진 배열
full(shape, value) 지정값으로 채움
eye(n) n×n 단위행렬

4. 슬라이싱과 뷰(View) (Ex04.py)

import numpy as np

arr = np.arange(10)
print(arr[3:8])  # 슬라이싱
print(arr[::2])  # 2칸씩

# 리스트 vs NumPy의 차이점
arr_slice = arr[5:8]
arr_slice[1] = 100
print(arr)  # 원본도 변경됨 (view)

 

  • NumPy 슬라이싱은 원본 참조(View)
    → 부분 변경 시 원본 배열도 바뀜
  • 리스트 슬라이싱은 복사(Copy)

 


5. 인덱싱 / 조건 필터링 (Ex05.py)

import numpy as np

arr = np.array([[1,2],[3,4],[5,6]])

# 행/열 인덱스 선택
print(arr[[0,1,2],[0,1,0]])  # [1 4 5]

# 조건 필터링
print(arr[arr > 2])  # [3 4 5 6]

 

기능 설명
arr[[행배열], [열배열]] 복수 인덱스 접근
arr[조건] 조건을 만족하는 요소 추출

6. 배열 결합, 수학 함수, 난수 (Ex06.py)

import numpy as np, random
from math import trunc

arr1 = np.array([1,2])
arr2 = np.array([3,4])

# 결합
print(np.concatenate((arr1, arr2)))  # [1 2 3 4]
print(np.vstack((arr1, arr2)))       # 세로로 쌓기
print(np.hstack((arr1, arr2)))       # 가로로 쌓기

# 반올림/올림/내림
arr = np.array([1.57, 2.48, 3.93, 4.33, -1.57])
print(np.ceil(arr), np.floor(arr), np.trunc(arr), np.round(arr,1))

# 통계함수
print(np.sum(arr), np.mean(arr), np.max(arr), np.min(arr))

# 난수
np.random.seed(0)
print(np.random.randint(1,30,(2,3)))  # 2행3열 난수

 

함수 설명
concatenate / vstack / hstack 배열 결합
ceil / floor / trunc / round 반올림/올림/내림
sum, mean, max, min 통계값
np.random.seed() 난수 고정
randint() 정수 난수 생성

정리

주제 키 포인트
배열 생성 np.array, arange, zeros, ones, eye
배열 구조 ndim, shape, size
연산 +, *, np.matmul, reshape, T
슬라이싱 View(참조) 주의
인덱싱 arr[[행],[열]], arr[조건]
결합 concatenate, vstack, hstack
수학 함수 ceil, floor, round, trunc
통계 sum, mean, max, min
난수 randint, seed, random.sample
조건/필터 논리연산자(&, `

'▶ python' 카테고리의 다른 글

22_Python_정규표현식  (0) 2025.10.31
21_Python 파이썬 동기/비동기  (0) 2023.12.13
20_Python 변수 타입 어노테이션  (0) 2023.12.13
19_Python 파이썬 모듈  (0) 2023.12.13
18_Python 파이썬 예외처리  (0) 2023.12.12

🧩 Python 정규표현식(Regex)  정리 예제

re 모듈을 활용한 정규식 패턴 매칭

 


🔹 1️⃣ 기본 패턴 매칭 (match vs search) 

import re

L = ['ab123', 'cd456', 'xy789', '12ef345qw', 'abc12']

# [패턴 설명]
# ^           → 문자열의 시작
# [a-zA-Z]{2} → 알파벳 2개
# \d{3}       → 숫자 3개
# $           → 문자열의 끝
regex = '^[a-zA-Z]{2}\\d{3}$'
pattern = re.compile(regex)

print("="*10, "match", "="*10)
# match(): 문자열의 처음부터 패턴이 일치해야 매치됨
for item in L:
    if pattern.match(item):
        print(f"패턴 일치: {item}")
    else:
        print(f"패턴 불일치: {item}")

print("="*10, "search", "="*10)
# search(): 문자열 전체 중 패턴이 포함되면 매치됨
for item in L:
    if pattern.search(item):
        print(f"패턴 일치: {item}")
    else:
        print(f"패턴 불일치: {item}")
========== match ==========
패턴 일치: ab123
패턴 일치: cd456
패턴 일치: xy789
패턴 불일치: 12ef345qw
패턴 불일치: abc12
========== search ==========
패턴 일치: ab123
패턴 일치: cd456
패턴 일치: xy789
패턴 불일치: 12ef345qw
패턴 불일치: abc12

🔹 2️⃣ 숫자 3개 이상 포함된 파일명 찾기

L = ['a.txt', 'a12.txt', 'a123.txt', 'a12345.txt']
regex = '^[a]\\d{3,}\\.txt$'   # a + 숫자 3개 이상 + .txt
pattern = re.compile(regex)

print("="*10, "a 숫자 3개 이상인 .txt", "="*10)
for item in L:
    if pattern.search(item):
        print(f"패턴 일치: {item}")
    else:
        print(f"패턴 불일치: {item}")
패턴 불일치: a.txt
패턴 불일치: a12.txt
패턴 일치: a123.txt
패턴 일치: a12345.txt

🔹 3️⃣ 한글만으로 구성된 문자열 찾기 (fullmatch)

L = ['hello!', 'hello안녕~', '하하하', '안녕^^', '반갑습니다.', '또 만나요', '파이썬', 'grape#*']
regex = '^[가-힣]+$'

# re.fullmatch(): 전체 문자열이 정확히 패턴과 일치해야 함
result = [word for word in L if re.fullmatch(regex, word)]
print(result)
['하하하', '파이썬']

🔹 4️⃣ findall / sub로 문자열 처리

print(re.findall('[가-힣]+', '안녕123 하세요!!! hello~~~'))
print(re.sub('\\s+', ' ', '   안녕        하세옹~~~ 까꿍   '))
출력 결과
['안녕', '하세요']
안녕 하세옹~~~ 까꿍

 

🔹 5️⃣ 이메일 아이디 / 도메인 분리

mailList = ['abc@naver.com', 'xya@daum.net', 'qwer@google.com']

userList = []
for mail in mailList:
    user, domain = re.split("@", mail)
    userList.append(f"아이디:{user}, 도메인:{domain}")

for info in userList:
    print(info)
아이디:abc, 도메인:naver.com
아이디:xya, 도메인:daum.net
아이디:qwer, 도메인:google.com

🔹 6️⃣ 그룹핑 (이름, 나이 추출)

text = '홍길동, 30세'
pattern = re.compile('(.+),\\s(\\d+)세')
match = pattern.fullmatch(text)

if match:
    print(f"이름 : {match.group(1)}")
    print(f"나이 : {match.group(2)}")
이름 : 홍길동
나이 : 30

 

 

🔹 7️⃣ 주소 패턴 추출 (시/구/동/번지)

address = "서울특별시 강남구 역삼동 123-45"
pattern = re.compile(r'(.+시)\s(.+구)\s(.+동)\s(\d{3}-\d{2})')
match = pattern.fullmatch(address)

if match:
    print(f"{match.group(0)}")
    print(f"시 : {match.group(1)}")
    print(f"구 : {match.group(2)}")
    print(f"동 : {match.group(3)}")
    print(f"번지: {match.group(4)}")
서울특별시 강남구 역삼동 123-45
시 : 서울특별시
구 : 강남구
동 : 역삼동
번지: 123-45

🔹 8️⃣ 날짜 패턴 추출

text = "오늘은 2025-10-23 입니다."
pattern = re.compile(r'(.+)\s(\d{4})-(\d{1,2})-(\d{1,2})\s(.+)')
match = pattern.search(text)

if match:
    today = match.group(1)
    year = match.group(2)
    month = match.group(3)
    day = match.group(4)
    string = match.group(5)

    print(f"{today} {year}년 {month}월 {day}일 {string}")
오늘은 2025년 10월 23일 입니다.

🔹 9️⃣ 파일 내용에서 이름별 합계 계산

전지현 80 90 83
김혜수 60 57 57
공유 100 88 89
fr = open("a.txt", encoding="utf-8", mode="r")
lines = fr.readlines()

for line in lines:
    pattern = re.compile(r'(.+)\s(\d{2})\s(\d{0,})\s(\d{0,})')
    match = pattern.search(line.strip())

    if match:
        sum1 = int(match.group(2))
        sum2 = int(match.group(3))
        sum3 = int(match.group(4))
        total = sum1 + sum2 + sum3

        print(f"{match.group(1)} - 합계 : {total}")
전지현 - 합계 : 253
김혜수 - 합계 : 174
공유 - 합계 : 277

 


정리

함수  설명
match() 문자열 시작부터 패턴이 일치해야 매치
search() 문자열 전체 중 한 곳이라도 일치하면 매치
fullmatch() 문자열 전체가 정확히 일치해야 매치
findall() 일치하는 모든 문자열을 리스트로 반환
sub() 일치하는 패턴을 치환(replace)
split() 패턴 기준으로 문자열 분리
group(n) 그룹핑된 n번째 그룹 추출

 

'▶ python' 카테고리의 다른 글

23_Python_NumPy  (0) 2025.10.31
21_Python 파이썬 동기/비동기  (0) 2023.12.13
20_Python 변수 타입 어노테이션  (0) 2023.12.13
19_Python 파이썬 모듈  (0) 2023.12.13
18_Python 파이썬 예외처리  (0) 2023.12.12
a = np.array([-1,3, 2, 6])
b = np.array([3,6,1,2])

A = a.reshape([2,2])
print(A)
print(f"A.ndim:{A.ndim}") # 2차원
print(f"A.shape:{A.shape}") #2,2

B = np.reshape(b,[2,2])
print(B)

print(f"A+B\n:{A+B}")
print(f"A*B\n:{A*B}")
print(f"np.matmul:\n{np.matmul(A,B)}")
A		B
[[-1  3]	[[3 6]
 [ 2  6]]	 [1 2]]
A+B
:[[2 9]
 [3 8]]
 
A*B
:[[-3 18]
 [ 2 12]]
 
np.matmul:
[[ 0  0]
 [12 24]]
# matmul
결과 행렬 AB = A × B
각 원소의 계산 과정:
AB[0][0] = A[0][0]*B[0][0] + A[0][1]*B[1][0] = (-1)*3 + (3)*1 = 0
AB[0][1] = A[0][0]*B[0][1] + A[0][1]*B[1][1] = (-1)*6 + (3)*2 = 0
AB[1][0] = A[1][0]*B[0][0] + A[1][1]*B[1][0] = (2)*3 + (6)*1 = 12
AB[1][1] = A[1][0]*B[0][1] + A[1][1]*B[1][1] = (2)*6 + (6)*2 = 24

 

 

👉 왼쪽은 e, g (B의 왼쪽 세로줄),
👉 오른쪽은 f, h (B의 오른쪽 세로줄) 과 곱하면 됩니다.

'🟡데이터 분석 > numpy' 카테고리의 다른 글

5. numpy 기본 통계  (0) 2024.06.03
4. numpy 불린 연산  (1) 2024.06.03
03. numpy_기본연산 (arange)  (0) 2024.06.03
2. 인덱싱 슬라이싱  (0) 2024.06.03
1. array 생성하기 및 모듈 별명 지어주기  (0) 2024.06.03

🌈 목 차

  1. VPC, IGW, SUBNET, EC2(인스턴스) 생성
  2. VPC, IGW, SUBNET, EC2(인스턴스) 삭제
  3. MobaXterm – nginx 설치

 


 

🏢 VPC 개념을 아파트로 비유해서 쉽게 정리 (접은글)

더보기
개념 비유 설명
VPC (Virtual Private Cloud) 🏢 아파트 단지 AWS 안의 나만의 네트워크 공간
Subnet (서브넷) 🏬 아파트 동 (301동, 302동) VPC 안에서 공간을 나눈 구역 — 보통 공용(퍼블릭) / 내부(프라이빗) 용도로 구분
EC2 인스턴스 🚪 아파트 101호, 102호 실제 컴퓨터(서버) 역할 — 서브넷(동) 안에 위치
IGW (Internet Gateway) 🚪 아파트 단지의 출입문 인터넷으로 들어오고 나가는 통로
Routing Table (라우팅 테이블) 🪧 아파트 내 길안내판 데이터가 어느 길로 나가야 할지 안내
Security Group / NACL 🔒 보안 규칙 누가 들어올 수 있고, 나갈 수 있는지를 통제
Private IP ☎️ 집전화 내부 통신용 IP (VPC 내부에서만 사용 가능)
Public IP 📱 휴대폰 번호 외부 인터넷과 통신할 수 있는 IP (자동 변경 가능)
Elastic IP (EIP) 📞 고정 전화번호 변하지 않는 고정 Public IP — 항상 같은 IP로 접속 가능

리소스 테이블 정리

분류 이름 설명 비고
VPC EDU-VPC 10.250.0.0/16 65,563개 IP 사용 가능
Subnet EDU-PUBLIC-SBN-2A 10.250.1.0/24 가용 영역 : 2A(마북리)
Subnet EDU-PUBLIC-SBN-2C 10.250.11.0/24 가용 영역 : 2C(평촌)
       
분류 이름 설명
인터넷 게이트 웨이 EDU-IGW  
라우팅 테이블 EDU-PUBLIC-RT PUBLIC 라우팅 테이블은 인터넷 게이트웨이 사용하도록 지정합니다.
       
분류 이름 설명
Security Group EDU-PUBLIC-SG-2A 인바운드 규칙 80, 443, 22 Port
Security Group EDU-PUBLIC-SG-2C 인바운드 규칙 80, 443, 22 Port
EC2 EDU-PUBLIC-EC2-2A 10.250.1.240
EC2 EDU-PUBLIC-EC2-2C 10.250.11.240

 

 

🔝 목차로 가기

 


🌈 VPC, IGW, SUBNET, EC2(인스턴스) 생성

 

 


1. VPC 생성

테이블에 있는 표 작성

 

 

 

🔝 목차로 가기

 


2. 인터넷 게이트웨이(IGW) 생성 및 연결

 

2) 생성한 인터넷게이트웨이 선택후 VPC에 연결

 

3) 연결완료

 


 

3. VPC 설정 편집


 

🔝 목차로 가기

 

 

4. 서브넷(Subnet) 생성

 

서브넷1 생성

 

 

서브넷2 생성

 


 

 

🔝 목차로 가기

 

5. 라우팅 테이블 생성 및 서브넷 연결

 

라우팅 편집

 

서브넷 연결 편

 

 

🔝 목차로 가기

 


6. 보안규칙 생성

 

보안그룹(Security Group) 생성

 

 

 

 

 

 

🔝 목차로 가기

 

 

7. EC2 인스턴스 생성

7-1) 키페어 생성

EC2화면

 

키페어 생성

 

키페어 생성 > 다운로드 파일

 

 

 

7-2) 인스턴스 생성

 

 

 

 

기본 IP에 테이블에 있는 EC2 설명에 있는 아이피 붙이기

 

 

 

 

 

 

🔝 목차로 가기

 


 

8. 탄력적 IP 생성

퍼블릭IP주소가 매번 바뀌므로 탄력적 IP생성해야 고정됨

 

 

public-2A-EIP

public-2C-EIP

 

생성한 탄력적IP를 선택후 주소연결

 

 

 

🔝 목차로 가기


 

🌈 VPC, IGW, SUBNET, EC2(인스턴스) 삭제

삭제 순서 개요

1. 탄력적 IP 해제 및 삭제

  • 하나씩 선택-연결해제
  • 한꺼번에 선택 - 릴리즈 삭제

2. EC2 인스턴스 종료

3. RDS 삭제

4. 보안그룹 삭제

5. VPC 삭제

6. DHCP 옵션 세트 삭제


1. 탄력적 IP삭제 

-1)탄력적 IP주소 연결 해제 선택 (하나씩 선택 - 연결해제)

-2)릴리즈 삭제 (한꺼번에 선택)

 

 

탄력적 IP주소 연결 해제 선택 (하나씩 선택 - 연결해제)

 

 

-릴리즈 삭제 (한꺼번에 선택)

 


 

2. EC2 삭제 - 인스턴스 종료

 

 


 

3 . RDS삭제

-- 최종스냅샷 생성 해제

-- 자동백업 보존 해제

-- 마지막 1개 체크

 


4. 보안그룹 삭제

-- rds-ec2-1 : 인바운드 규칙 삭제

-- ec2-rds-1 : 아웃바운드 규칙 삭제

 

-- default를 제외한 나머지 삭제


 

5. VPC 삭제

(서브넷, 인터넷게이트웨이, 라우팅 테이블 자동 삭제)

 


 

6. DHCP 옵션 세트 삭제

 

 

🔝 목차로 가기


🌈 MobaXterm – nginx 설치

원격 접속(Remote host) 설정

 

 

Remote host : 탄력적 IP 작성

private key : 생성한 키페어 선택

상단 Bookmark setting : 이름 생성

 

 

 

 

nginx 설치 명령어

sudo : 관리자 권한 명령

cp : copy

vi : 편집

 

$ ping -c 5 탄력적IP
$ sudo apt update
$ sudo apt install -y nginx
$ sudo systemctl start nginx
$ sudo systemctl status nginx
$ git clone https://github.com/seoljinuk/ec2_homepage.git
$ cd ec*
$ ls
$ cd WebServer02
$ sudo cp index.html /usr/share/nginx/html/
$ sudo cp image01.png /usr/share/nginx/html/
$ sudo vi /etc/nginx/sites-available/default

// ESC I (INSERT)
root /usr/share/nginx/html/; (수정)
// ESC ; 
:wq -- 저장  
:q! -- 저장x 

$ sudo systemctl restart nginx

 

엔진 시작

 

 

 

 

 

 

🌈 데이터베이스 설치 – RDS(MySQL)


식별자  dbmysql80
마스터 사용자 이름 myroot
암호  (본인 암호 입력)
초기 데이터베이스 이름 shopping

 

 

 

 

 

데이터베이스 EC2에 연결 설정 명령어

$ sudo apt update
$ sudo apt install mysql-client -y
$ mysql -h [엔드포인트 붙여넣기] -P 3306 -u myroot -p
password:

>mysql(작성)

// ctrl + Z (mysql나가기)
$ cd
$ git clone https://github.com/seoljinuk/shopping_02_yes_database.git
$ ls
ec2_homepage  shopping_02_yes_database 

$ cd sh*
$ ls
$ cd src
$ cd main
$ cd resources
$ sudo vi application.properties

// 편집
url = localhost만 지우고 엔드포인트 붙여넣기
username = "작성"
userpassword ="작성"
// 저장 esc ;
:wq

$ cd
$ cd sho*
$ ls (pom.xml 위치한 곳에서 mvn메이븐 작성)
$ mvn package (test-compile 실행)

❗오류시 아래 코드 작성
---------------------------------------
$ sudo apt install maven
$ sudo apt install openjdk-17-jdk -y
$ sudo apt install -y maven
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
$ mvn clean compile

내 PC 고급시스템 설정-> 환경변수 설정 -> jdk17-bin위치 설정 -> 시스템 변수 설정 -> 편집
---------------------------------------

(target 이동)
$ ls 
$ cd target 

-- port 9000으로 수정 
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 9000 
-- 실행 명령어
$ java -jar shopping-0.0.1-SNAPSHOT.jar

--> 탄력적IP주소 주소창에 입력후 이동 확인

 

더보기

sql작성문

use shopping ;
show tables ;

CREATE TABLE products (
    id BIGINT PRIMARY KEY,
    name VARCHAR(100),
    price INT,
    description TEXT,
    image_url VARCHAR(255)
);

INSERT INTO products (id, name, price, description, image_url) VALUES
(1, '카푸치노1', 4500, '맛있는 카푸치노', '/images/cappuccino01.png'),
(2, '크로아상2', 5000, '빵은 역시 크로아상^^', '/images/croissant_01.png'),
(3, '우유3', 3000, '따듯한 우유 조아요ㅎㅎ', '/images/milk01.jpg');

commit;

select * from products ;

 

🔝 목차로 가기

'🟡개발 도구 > AWS' 카테고리의 다른 글

aws  (0) 2024.01.18

1. 공공데이터 출력 (.csv)

package com.example.Ex02.TEST;

import java.io.*;

public class Ex01 {
    public static void main(String[] args) {
        File file =new File("file\\기상청27_관광코스별_관광지_지점정보.csv");
        BufferedReader br;
        String line;
        int count =0;
        try {
            br = new BufferedReader(new FileReader(file)); //연결 다리
            while((line = br.readLine()) != null) {
                count++;
                String [] arr = line.split(",");

                // 남해, 힐링 관광지 출력
                if (arr[4].contains("(남해)") && arr[10].contains("힐링")){
                    System.out.println(line);
                }
            }
            System.out.println("Count :" + count);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
package com.example.Ex02.TEST;

import java.io.*;

public class Ex02 {
    public static void main(String[] args) {

        // 강남구 도서관 출력
        File file =new File("file\\서울시 공공도서관 현황정보.csv");
        BufferedReader br;
        String line;

        try {
            br = new BufferedReader(new FileReader(file));
            while((line = br.readLine()) != null){
                String[]arr = line.split(",");
                if(arr[3].equals("\"강남구\"")){
                    System.out.println(line);
                }
            }

            br.close();
            br = new BufferedReader(new FileReader(file));

            // 어린이가 포함된 도서관 출력
            int count=0;
            while((line = br.readLine()) != null){
                String[]arr = line.split(",");
                if (arr[1].contains("어린이")) {
                    count++;
                    System.out.println(line);
                }
            }
            System.out.println("총 어린이 도서관 개수: " + count);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

 


2. 공공데이터 출력 ( json) 

 

pom.xml 입력

<dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1</version>
</dependency>

 

 

 

현재 위치 출력

public class Ex03 {
    public static void main(String[] args) throws IOException, ParseException, JSONException {

        Path currentPath = Paths.get("."); // 현재 위치
        String path = currentPath.toAbsolutePath().toString();
        System.out.println("path : " + path); // path : C:\Spring_study\Ex16\.

 

 

test1.json

{
"name" : "apple",    
"id" : 1,    
"price" : 1000
}
        System.out.println("=========Ex01=========");
        JSONParser parser = new JSONParser(); // Json (parser)파서기를 이용해 속성과 값을 분리
        Reader reader = new FileReader("file\\test1.json");
        JSONObject jsonObject = (JSONObject)parser.parse(reader);

        String name = (String) jsonObject.get("name");
        long id = (Long) jsonObject.get("id");
        long price = (Long) jsonObject.get("price");

        System.out.println("name :" + name);
        System.out.println("id :" + id);
        System.out.println("price :" + price);

        Set keySet = jsonObject.keySet();
        for (Object key : keySet) {
            System.out.println("key: " + key + ", value: " + jsonObject.get(key));
        }
}

 

test2.json

[
	{"name":"길동","age":"44"}, 
	{"name":"상철","age":"33"}
]
  System.out.println("=========Ex02=========");
        JSONParser parser2 = new JSONParser();
        Reader reader2 = new FileReader("file\\test2.json");
        Object jsonObject2 = parser2.parse(reader2);

        JSONArray jsonArr2 = (JSONArray) jsonObject2;
        System.out.println(jsonArr2.size());

        for (int i = 0; i < jsonArr2.size(); i++) {
            JSONObject jObject = (JSONObject)jsonArr2.get(i);
            Set keySet2 = jObject.keySet();
            for (Object key : keySet2) {
                System.out.println(key + " : " + jObject.get(key));
            }
        }

 

test3.json

{
	"id" : 1,
	"employee" : [
				{"name" : "윤아", "age":30 },
				{"name" : "웬디", "age":50 }
			],
	"company" :"메타 빌드"
}
System.out.println("=========Ex03=========");
        JSONParser parser3 = new JSONParser();
        Reader reader3 = new FileReader("file\\test3.json");
        JSONObject jsonObject3 = (JSONObject)parser3.parse(reader3);

        JSONArray jsonArr3  = (JSONArray)jsonObject3.get("employee");
        for (int i = 0; i < jsonArr3.size(); i++){
            JSONObject jObject3 = (JSONObject)jsonArr3.get(i);
            Set keySet3 = jObject3.keySet();
            for (Object key : keySet3){
                System.out.println(key +":"+jObject3.get(key));
            }

        }

 

💡 요약 한 줄

Ex01 = {} 단일 객체
Ex02 = [] 여러 객체 배열
Ex03 = { "키": [ ... ] } 객체 내부 배열

 

파일명  JSON 구조 파싱 객체  접근 방법
test1.json {} 단일 객체 JSONObject .get("키")
test2.json [] 배열 JSONArray for + get(i)
test3.json { "employee": [ ... ] } JSONObject → JSONArray get("employee") 후 반복

 

전체코드

더보기
package com.example.Ex02.TEST;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Set;

public class Ex03 {
    public static void main(String[] args) throws IOException, ParseException {

        // 현재 실행 경로 출력
        Path currentPath = Paths.get(".");
        String path = currentPath.toAbsolutePath().toString();
        System.out.println("path : " + path);

        // ------------------ Ex01: 단일 객체 ------------------
        System.out.println("=========Ex01=========");
        JSONParser parser = new JSONParser();
        Reader reader = new FileReader("file\\test1.json");
        JSONObject jsonObject = (JSONObject) parser.parse(reader);

        // 개별 key-value 접근
        System.out.println("name : " + jsonObject.get("name"));
        System.out.println("id : " + jsonObject.get("id"));
        System.out.println("price : " + jsonObject.get("price"));

        // 전체 key-value 출력
        for (Object key : jsonObject.keySet())
            System.out.println(key + " : " + jsonObject.get(key));


        // ------------------ Ex02: 배열 ------------------
        System.out.println("=========Ex02=========");
        JSONParser parser2 = new JSONParser();
        Reader reader2 = new FileReader("file\\test2.json");
        JSONArray jsonArr2 = (JSONArray) parser2.parse(reader2);

        // 배열 안의 각 객체 출력
        for (Object obj : jsonArr2) {
            JSONObject jObject = (JSONObject) obj;
            for (Object key : jObject.keySet())
                System.out.println(key + " : " + jObject.get(key));
        }


        // ------------------ Ex03: 객체 내부 배열 ------------------
        System.out.println("=========Ex03=========");
        JSONParser parser3 = new JSONParser();
        Reader reader3 = new FileReader("file\\test3.json");
        JSONObject jsonObject3 = (JSONObject) parser3.parse(reader3);

        // "employee" 배열 추출 후 반복 출력
        JSONArray jsonArr3 = (JSONArray) jsonObject3.get("employee");
        for (Object obj : jsonArr3) {
            JSONObject jObject3 = (JSONObject) obj;
            for (Object key : jObject3.keySet())
                System.out.println(key + " : " + jObject3.get(key));
        }
    }
}

 

3. 공공데이터 출력 ( json) 

https://git-scm.com/downloads/win

 

Git - Downloading Package

Download for Windows Click here to download the latest (2.51.0(2)) x64 version of Git for Windows. This is the most recent maintained build. It was released on 2025-09-29. Other Git for Windows downloads Standalone Installer Git for Windows/x64 Setup. Git

git-scm.com


Git Bash를 항상 관리자 권한으로 실행

 

  • “Git Bash” 아이콘 우클릭 → “속성”
  • “호환성” 탭 → “관리자 권한으로 이 프로그램 실행” 체크

 


bash에서 cd/c/..파일 경로를 통해 들어가기

cd /c/Java_ljr

 

다음 단계 (GitHub 연결)

git init
git remote add origin https://github.com/jeongryuni/Study_Java.git
git add .
git commit -m "first commit"
git branch -M main
git push -u origin main

 

 

gitignore생성

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

.gitignore

+ Recent posts