전체 글 (162)
2025-05-02 00:37:33

ㅊKeras로 신경망을 작성하는 절차

model = tf.models.Sequential()

model.add(tf.keras.layers.Dense(units=2, input=(2,), activation='sigmoid'))
model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

model.compile(loss='mean_squared_error', optimizer=keras.optimizers.SGD(lr=0.3))

model.fit(X, y, batch_size=1, epochs=10000)

print(model.predict(X))

 

compile(optimizer, loss=None, metrics=None) : 훈련을 위해서 모델을 구성하는 메소드

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1) : 훈련 메소드

evaluate(x=None, y=None) : 테스트 모드에서 모델의 손실 함수값과 측정 항목 값을 반환

predict(x, batch_size=None) : 입력 샘플에 대한 예측값을 생성

add(layer) : 레이어를 모델에 추가

 

Keras 사용 방법

1) Sequential 모델을 만들고 모델에 필요한 레이어를 1 추가하는 방법

 

model = Sequential()

 

model.add(Dense(units=2, input_shape=(2, ), activation='sigmoid'))

model.add(Dense(units=1, activation='sigmoid'))

 

2) Sequential 모델을 만들고 모델에 필요한 레이어를 추가하는 방법

 

model = Sequential()

 

model.add(Dense(units=2, input_shape=(2, ), activation='sigmoid'))

model.add(Dense(units=3, activation='sigmoid'))

model.add(Dense(units=1, activation='sigmoid'))

 

keras의 클래스들

  • 모델 : 하나의 신경망을 나타낸다
  • 레이어 : 신경망에서 하나의 층
  • 입력 데이터 : 텐서플로우 텐서 형식
  • 손실 함수 : 신경망의 출력과 정답 레이블 간의 차이를 측정하는 함수
  • 옵티마이저 : 학습을 수행하는 최적화 알고리즘. 학습률과 모멘텀을 동적으로 변경한다.

Input(shape, batch_size, name) : 입력을 받아서 케라스 텐서를 생성하는 객체

Dense(units, activation=None, use_bias=True, input_shape) : 유닛들이 전부 연결된 레이어

 

tf.keras.layers.Dense

완전 연결 계층 : 한 층의 모든 뉴런이 그 다음 층의 모든 뉴런과 연결된 상태

 

케라스 신경망 파라미터 -loss (손실 함수)

  • 회귀 
    • MeanSquaredError : 정답 레이블과 예측값 사이의 평균 제곱 오차를 계산
    • 분류에 사용되기도 함
  • 분류
    • BinaryCrossentropy : 정답 레이블과 예측 레이블 간의 교차 엔트로피 손실을 계산한다
      ex) 강아지, 강아지 아님
    • CatrgoryCrossentropy : 정갑 레이블과 예측 레이블 간의 교차 엔트로피 손실을 계산한다.
      ex) 강아지, 고양이, 호랑이. (정답 레이블은 원핫 인코딩으로 제공되어야 한다)
    • SparseCategoricalCrossentropy : 정답 레이블과 예측 레이블 간의 교차 엔트로피 손실을 계산한다.
      ex) 강아지, 고양이, 호랑이. (정답 레이블은 정수로 제공되어야 한다)

One hot encoding

3개의 class 강아지, 고양이, 호랑이 일 때, 한개의 1과 복수의 0으로 이루어진 벡터로 표현

  • 강아지 (0) => 1, 0, 0
  • 고양이 (1) => 0, 1, 0
  • 호랑이 (2) => 0, 0, 1
  •  

from tensorflow import keras
y_true = [80, 84, 92, 94]
y_pred = [70, 80, 90, 100]
mse=keras.losses.MSE
print(mse(y_true, y_pred).numpy())

 

 from tensorflow import keras
 y_true = [1, 0, 0, 1]
 y_pred = [0.7, 0.2, 0.3, 0.9]
 bce = keras.losses.BinaryCrossentropy()
 print(bce(y_true, y_pred).numpy())
 
 from tensorflow import keras
 y_true = [1, 0, 0, 1]
 y_pred = [0.6, 0.3, 0.4, 0.7]
 bce = keras.losses.BinaryCrossentropy()
 print(bce(y_true, y_pred).numpy())

 

 from tensorflow import keras
 y_true = [[0, 1, 0], [0, 0, 1], [1, 0, 0]]
 y_pred = [[0.6, 0.3, 0.1], [0.3, 0.6, 0.1], [0.7, 0.1, 0.2]]
 cce = keras.losses.CategoricalCrossentropy()
 print(cce(y_true, y_pred).numpy())
 
 from tensorflow import keras
 y_true = [[0, 1, 0], [0, 0, 1], [1, 0, 0]]
 y_pred = [[0.9, 0.0, 0.1], [0.2, 0.7, 0.1], [0.8, 0.1, 0.1]]
 cce = keras.losses.CategoricalCrossentropy()
 print(cce(y_true, y_pred).numpy())

 

keras 신경망 파라미터 : batch_size

  • 샘플을 몇 개 사용하여 가중치를 변경할 지 단위
  • batch_size가 너무 크면 학습 속도가 느려지고,
  • 너무 작으렴 학습 과정이 불안정해질 수 있음
  • 변수 (w, b)가 업데이트 되는 단위

1 epoch는 전체 샘플이 처리되는 기준

전체 샘플이 300개이고, batch_size가 30이면, 1 epoch동안 10번 가중치가 update됨

전체 샘플이 300개이고, batch_size가 10이면, 1 epoch동안 30번 가중치가 update됨

 

 

Metric : 측정 항목

Accuracy : 정확도. 예측값이 정답 레이블과 같은 횟수를 계산한다

MeanSquaredError : MSE

넘파이 배열

TensorFlow Dataset 객체 : 크기가 커서, 메모리에 한번에 적재될 수 없는 경우에 디스크 또는 분산 파일 시스템에서 스트리밍 될 수 있다.

파이썬 제너레이터 : 

 

 

import matplotlib.pyplot as plt
import tensorflow as tf

(train_images, train_labels), (test_images, test_labels)  = tf.keras.datasets.mnist.load_data()

print(train_images.shape)

print(train_labels)
print(test_images.shape)

plt.imshow(train_images[0], cmap="Greys")

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(512, activation='relu', input_shape=(784,)))
model.add(tf.keras.layers.Dense(10, activation='sigmoid'))

model.compile(optimizer='rmsprop',
                loss='mse',
                metrics=['accuracy'])            

train_images = train_images.reshape((60000, 784))
train_images = train_images.astype('float32') / 255.0

test_images = test_images.reshape((10000, 784))
test_images = test_images.astype('float32') / 255.0

train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)

model.fit(train_images, train_labels, epochs=5, batch_size=256)

test_loss, test_acc = model.evaluate(test_images, test_labels)
print('테스트 정확도:', test_acc)

plt.show()

 

핵심 포인트 

유닛 수가 커질수록, 배치 사이즈가 작아질 수록 정확도는 올라간다!

하지만 학습 속도가 느려질 가능성이 있다..

 

범주형 데이터 처리

 

 

정수 인코딩

sklearn 라이브러리가 제공하는 Label Encoder 클래스를 사용

import numpy as np

X = np.array([['Korea', 44, 7200],
              ['Japan', 27, 4800],
              ['China', 30, 6100]])
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
X[:, 0] = labelencoder.fit_transform(X[:, 0])
print(X)
 
[['2' '44' '7200']
['1' '27' '4800']
['0' '30' '6100']]

 

import numpy as np

X=np.array([['Korea', 44, 7200],
            ['Japan', 27, 4800],
            ['China', 30, 6100]]) # Removed extra space before this line

from sklearn.preprocessing import OneHotEncoder # Added a missing space

onehotencoder= OneHotEncoder()
# 원하는열을뽑아서2차원배열로만들어서전달하여야한다.
XX = onehotencoder.fit_transform(X[:,0].reshape(-1,1)).toarray()
print(XX)
X = np.delete(X, [0], axis=1) # 0번째열삭제
X = np.concatenate((XX, X), axis = 1) # X와XX를붙인다.
print(X)
 
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]]
[['0.0' '0.0' '1.0' '44' '7200']
['0.0' '1.0' '0.0' '27' '4800']
['1.0' '0.0' '0.0' '30' '6100']]
 

 

원 핫 인코딩

import numpy as np
X = np.array(['Korea', 'Japan', 'China'])

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()
XX = onehotencoder.fit_transform(X.reshape(-1, 1)).toarray()
print(XX)
 
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]]

 

케라스의 to_catetorical()

class_vector = [2, 6, 6, 1]

from tensorflow.keras.utils import to_categorical
output = to_categorical(class_vector, num_classes=7)
print(output)
 
[[0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1.]
[0. 0. 0. 0. 0. 0. 1.]
[0. 1. 0. 0. 0. 0. 0.]]

아래 문자열 입력을 정수형으로 변경하고 print하는 code를 작성하시오

import numpy as np
X = np.array(['apple','grape','melon','orange'])

from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
XX = labelencoder.fit_transform(X)
print(XX)
 
[0 1 2 3]

 

아래 문자열 입력을 원 핫 인코딩으로 변경하고 print하는 code를 작성하시오.

import numpy as np
X = np.array(['apple','grape','melon','orange'])

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()
XX = onehotencoder.fit_transform(X.reshape(-1, 1)).toarray()
print(XX)

[[1. 0. 0. 0.][0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]]

아래 class vector를 원 핫 인코딩으로 변경하고 print하는 code를 작성하시오.

from tensorflow import keras

class_vector =[8, 3, 2, 5]
from tensorflow.keras.utils import to_categorical
output = to_categorical(class_vector, num_classes=10)
print(output)
 
[[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]

 

 

케라스 딥러닝 - 소프트 맥스

총헙아 1안 형태로 변환

 

 

케라스 신경망 실습 - 패션 아이템 분류

  • 이미지는 28*28 크기
  • 픽셀 값은 0과 255 사이
  • 레이블은 0부터 9 까지

model = models.Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
 
model = models.Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

 

판다스

  • 데이터를 머신러닝이나 시각화에 적절하도록 전처리 해주는 라이브러리
  • 자료구조 : 데이터 프레임
  • import pandas as pd

 

 

케라스 신경망 실습 - 타이타닉 생존자 예측

PassengerId : 각 승객의고유번호

Survived : 생존 여부(종속변수) •0 = 사망 •1 = 생존

Pclass : 객실 등급-승객의사회적, 경제적지위 •1st = Upper •2nd = Middle •3rd = Lower

Name : 이름 Sex : 성별 Age : 나이

SibSp : 동반한Sibling(형제자매)와

Spouse(배우자)의수 Parch : 동반한

Parent(부모) Child(자식)의 수

Ticket : 티켓의 고유넘버

Fare : 티켓의 요금

Cabin : 객실 번호

Embarked : 승선한 항 •C = Cherbourg •Q = Queenstown •S = Southampton

 

import numpy as np
import pandas as pd
import tensorflow as tf

# 데이터 세트를 읽어들인다.
train = pd.read_csv("train.csv", sep=',')
test = pd.read_csv("test.csv", sep=',')

# 필요없는 컬럼을 삭제한다.
train.drop(['SibSp', 'Parch', 'Ticket', 'Embarked', 'Name',\
        'Cabin', 'PassengerId', 'Fare', 'Age'], inplace=True, axis=1)
test.drop(['SibSp', 'Parch', 'Ticket', 'Embarked', 'Name',\
        'Cabin', 'PassengerId', 'Fare', 'Age'], inplace=True, axis=1)

# 결손치가 있는 데이터 행은 삭제한다.
train.dropna(inplace=True)
test.dropna(inplace=True)

# 기호를 수치로 변환한다.
for ix in train.index:
    if train.loc[ix, 'Sex']=="male":
       train.loc[ix, 'Sex']=1
    else:
       train.loc[ix, 'Sex']=0
for ix in test.index:
    if test.loc[ix, 'Sex']=="male":
       test.loc[ix, 'Sex']=1
    else:
       test.loc[ix, 'Sex']=0


# 2차원 배열을 1차원 배열로 평탄화한다.
target = np.ravel(train.Survived)


# 생존여부를 학습 데이터에서 삭제한다.
train.drop(['Survived'], inplace=True, axis=1)
train = train.astype(float)     # 최근 소스에서는 float형태로 형변환하여야
test = test.astype(float)     # 최근 소스에서는 float형태로 형변환하여야



# 케라스 모델을 생성한다.
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16, activation='relu', input_shape=(2,)))
model.add(tf.keras.layers.Dense(8, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

# 케라스 모델을 컴파일한다.
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
# 케라스 모델을 학습시킨다.
model.fit(train, target, epochs=30, batch_size=1, verbose=1)

 

 

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16, activation='relu', input_shape=(2,)))
model.add(tf.keras.layers.Dense(8, activation='relu'))
model.add(tf.keras.layers.Dense(8, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

0.7436
 
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16, activation='relu', input_shape=(2,)))
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dense(8, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
 
0.8120

 

 

 

 

 

 

 

 

 

 

'인공지능 공부' 카테고리의 다른 글

인공지능 6주차  (0) 2025.04.08
인공지능 5주차  (0) 2025.04.01
인공지능 2차시  (0) 2025.03.18
인공지능  (0) 2025.03.18
2025-04-29 17:25:15

디자인 패턴

  • 자주 사용하는 설계 형태를 정형화하여 이를 유형별로 설계 탬플릿을 만들어 둔 것
  • 많은 개발자들이 경험상 체득한 설계 지식을 검증하고, 이를 추상화하여 일반화한 템플릿

장점

  • 개발자(설계자) 간의 원할한 의사소통
  • 소프트웨어 구조 파악 용이
  • 재사용을 통한 개발 시간 단축
  • 설계 변경 요청에 대한 유연한 대처

 

종류 : 27개

  • 기본 패턴 : 4개
  • 생성 패턴 : 5개
  • 구조 패턴 : 7개
  • 행위 패턴 : 11개

 

기본 패턴

  • 객체지향 프로그램 에서 흔해 쓰는 기본적인 패턴
  • 개념 실체 패턴 
    • 개념 클래스를 실체 클래스에서 분리하는 것은 중복되는 정보를 저장하지 않기 위해서이다
  • 플레이어 역할 패턴 : 플레이어가 환경에 따라 다른 역할을 해야 할 때
  • 위임 패턴 : 다른 클래스의 오퍼레이션에 작업을 요청
  • 계층 구조 패턴 : 회사의 조직도, 파일 구조, 구문 트리 등 계층 구조를 다룰 때 필요

생성 패턴

  • 팩토리 패턴
  • 싱글턴 패턴
    1. 생성자를 private으로 선언
    2. 객체 생성을 static으로 선언
    3. getInstance()를 만들어 외부에서 사용하도록 함
    4. getInstance() 메서드를 동기화
  • 프로토타입 패턴
  • 빌더 패턴
  • 추상 팩토리 패턴

구조 패턴

  • 데코레이터 패턴
  • 어댑터 패턴
  • 컴포지트 패턴
  • 브리지 패턴
  • 퍼사드 패턴
  • 플라이웨이트 패턴
  • 프록시 패턴

행위 패턴

  • 전략패턴
  • 반복자 패턴
  • 견본 패턴
  • 책임 체인 패턴
  • 중재자 패턴
  • 통역자 패턴
  • 상태 패턴
  • 옵서버 패턴
  • 방문자 패턴
  • 커맨트 패턴
  • 기념 패턴
2025-04-18 11:02:51

 UDP란?

UDP 소켓의 특성

  • User Datagram Protocol
  • IP를 기반으로 데이터를 전송한다.
  • 흐름제어를 하지 않기 때문에 데이터 전송을 보장 받지 못한다. (신뢰할 수 없는 데이터 전송*)
  • 프로토콜 자체가 간단하여 속도가 빠르다.

 

UDP의 내부 동작

  1. 기본 데이터 단위 : 데이터그램
  2. IP(L3 프로토콜)가 데이터를 라우팅을 통해 목적지 까지 전달
  3. UDP(L4 프로토콜)는 호스트내에서 port를 통해 최종 목적지 프로세스를 구별*

 

UDP의 효율적인 사용

  1. 압축 파일 : TCP가 유리,                       실시간 서비스 : UDP가 유리
  2. 데이터 양이 많은 경우 : TCP가 유리,  데이터 양이 적은 경우 : UDP가 유리

 

UDP 기반 서버/ 클라이언트 구현

UDP 서버는 클라이언트와 연결되어 있지 않다

  • 서버와 클라이언트 간에 연결 상태가 존재하지 않는다
  • TCP에서 필요하던 listen(), accpet(), connect() 함수가 불필요하다

UDP의 소켓은 오직 하나

  • 데이터를 주고 받기 위한 소켓은 하나만 생성된다
  • TCP에서는 서버에 연결된 클라이언트 수 만큼 소켓이 생성됨
  • 소켓 하나로 여러 개의 클라이언트와 송수신 가능

 

UDP 기반의 데이터 입출력 함수

 

 

UDP 기반의 데이터 입출력 함수

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'TCP_IP 공부' 카테고리의 다른 글

TCP_IP 6주차  (1) 2025.04.11
TCP_IP 4주차  (0) 2025.03.28
TCP_IP 2차시  (0) 2025.03.21
TCP_IP 1주차  (0) 2025.03.14
2025-04-15 17:44:54

16 : 20분까지 4호관 401호로

이번주 금요일 까지 피드백

 

계산식 3문제 : 소문제 포함 8문제

객관식 4점씩 15문제

 

계산식 1)

cocomo 방법

17, 18페이지 (p/m , tdev 구하기)

p/m의 상수값 알려주신다 하심

문제풀이 다 써야함

 

승수 표시하기 : ^ 사용하기

 

tdev 도 상수값 알려주신다함

 

계산식 2)

표 주신다함

UFP, TCF, FP 구하기

식 다 써야함

 

계산식 3)

cpm 작업 과정

es, ef, ls, lf, st값 구하기 (3개 나온다고 함)

 

 

객관식)

[객관식 문제 - 4지 선다형] 4점씩 15문제

1-1. 소프트웨어 공급방식에 따른 유형 중 특정 고객의 수요를 만족하기 위해 개발 소프트웨어는 무엇인가?  

주문형 소프트웨어


1-2. 소프트웨어 공급방식에 따른 유형 중 일반적으로 공개된 시장에서 판매하며, 범용 소프트웨어라고도 불리는 개발 소프트웨어는 무엇인가? 

패키지형 소프트웨어


1-3. 소프트웨어 공급방식에 따른 유형 중 변경이 어려우며, 개발방법과 프로세스가 달라 별도 분야로 취급 개발 소프트웨어는 무엇인가?

임베디드 소프트웨어

 

1-4. 소프트웨어의 분류 중 각종 센서를 이용하거나 기기들의 동작을 제어하는 소프트웨어는 무엇인가?

제어 소프트웨어


1-5. 소프트웨어의 분류 중 장비나 기기에 내장된 형태의 소프트웨어는 무엇인가?

임베디드 소프트웨어


1-6. 소프트웨어의 분류 중 자료를 받아들여 가공한 후 정보를 제공하는 소프트웨어로, 주로 DB에 자료를 저장한 후 검색을 통해 사용자가 원하는 형태로 정보를 제공하는 소프트웨어는 무엇인가?

관리 소프트웨어

2-1. 요구 사항 검증 내용 중 요구사항 간에 모순되거나 충돌되는 점은 없는지, 산출물 또는 요구사항의 내용이 일관적인지를  나타내는 요구 분석 명세서의 활동 내용은?

일관성


2-2. 요구 사항 검증 내용 중 표현이 애매모호하지 않고 참여자가 명확히 이해할 수 있는가를 나타내는 요구 분석 명세서의 활동 내용은?

명확성


2-3. 요구 사항 검증 내용 중 모든 요구 사항이 누락되지 않고 완전하게 반영되고 있는가를 나타내는 요구 분석 명세서의 활동 내용은?

완전성

3-1. 고객의 요구에 민첩하게 대응하고 그때그때 주어지는 문제를 풀어나가는 방법론으로 ①프로세스와 도구 중심이 아닌, 개개인과의 상호 소통 중시, ②문서 중심이 아닌, 실행 가능한 소프트웨어 중시 등을 기본가치로 내세우는 모델은?

애자일 프로세스


3-2. 진화적 프로세스 모델의 대표적인 방법으로 소프트웨어 개발에서는 정식 절차에 따라 완전한 소프트웨어를 만들기 전에 사용자의 요구대로 일단 모형을 만들고 사용자와 의사소통 도구로 활용하는 모델은?

프로토타입 모델


3-3. 진화적 프로토타입 모델에 위험 분석을 추가한 모델로 사전 위험 분석을 통한 돌출 위험 요소를 감소시켜 프로젝트 중단 확률을 감소시키고, 사용자 요구가 충분히 반영된 제품을 개발하여 사용자의 불만 감소를 장점으로 가지고 있는 모델은?

나선형 모델

4-1. 설계의 원리 중 큰 문제를 소 단위로 나누고 소 단위 작업을 하나씩 처리하여 전체 일을 끝내는 방법은?

분할과 정복


4-2. 설계의 원리 중 주어진 문제에서 현재의 관심사에 초점을 맞추기 위해, 특정한 목적과 관련된 필수 정보만 추출하여 강조하고 관련이 없는 세부 사항을 생략함으로써 본질적인 문제에 집중할 수 있도록 하는 작업 방법은?

추상화


4-3. 설계의 원리 중 사용자에게 해당 객체의 기능과 사용법만 제공해 사용하기 쉽게 하고 내부는 함부로 변경할 수 없게 감추는 개념의 방법은?

캡슐화


5-1. 추상화 중 주어진 문제에 대해 프로그래밍하기 전 상세 부분은 생략하고 전체 흐름만 파악할 수 있는 알고리즘 형태로 작성하는 추상화는?

과정 추상화


5-2. 추상화 중 단계가 올라갈수록 표현이 더욱 간결해지고 특징만 나타낸다는 장점을 가지고 있으며, 프로그램 언어에서 쓰는 제어 구조를 추상화할 때 사용하는 추상화는?

제어 추상화


5-3. 추상화 중 데이터와 데이터 구조를 감추는 것으로 데이터와 메서드를 클래스 형태로 캡슐화 해 숨겨 놓고 사용자에게는 꼭 필요한 기능만 사용할 수 있게 개방한 구조의 추상화는?

데이터 추상화


6-1. 개발 방법론에 따른 모델링 언어 중 UML 표기법의 모델링 언어를 사용하는 방법론은?

객체지향 방법론


6-2. 개발 방법론에 따른 모델링 언어 중 DFD, DD, 프로세스 명세 등의 모델링 언어를 사용하는 방법론은?

구조적 방법론


6-3. 개발 방법론에 따른 모델링 언어 중 DB 설계 시 표현을 ERD로하는 방법론은?

정보공학 방법론


7-1. 통합프로세스 모델의 단계 중 준비 단계, 인지 단계 등 다양한 이름으로 불리며, 비즈니스 모델링과 요구사항 정의 관련 작업이 가장 많이 이루어지는 단계는?

도입 단계


7-2. 통합프로세스 모델의 단계 중 상세 단계로도 불리며, 보통 2~4개의 반복 단위로 구성되고, 비즈니스 모델링과 요구사항 정의 작업은 점차 줄고, 분석 및 설계 작업이 가장 많이 이루어지는 단계는?

구체화 단계


7-3. 통합프로세스 모델의 단계 중 이행 단계로도 불리며, 사용자를 위한 제품을 완성하는 단계로, 완성된 제품을 사용자에게 넘겨주는 과정에서 수행해야 할 일을 작업하는 단계는? 

전이 단계

 

8번 문제는 옳은 것을 정리해 두었다.
8-1. 소프트웨어 프로세스 모델의 목적으로 볼 수 없는 것은?

주어진 예산과 자원으로 개발하고, 관리하는 방법을 구체적으로 정의

고품질의 소프트웨어 제품을 만드는 것이 목적


8-2. 소프트웨어 프로세스 모델을 정의한 것으로 볼 수 없는 것은?

소프트웨어 개발 프로세스 모델은 소프트웨어를 어떻게 개발할 것인가에 대한 전체 흐름을 체계화한 개념

개발 계획 수힙부터 최종 폐기까지의 전 과정을 순차적으로 다룸


8-3. 소프트웨어 프로세스 모델의 역할로 볼 수 없는 것은?

프로젝트에 대한 전체적인 기본 골격을 세워 일정 계획을 수립할 수 있고, 개발 비용 산정뿐 아니라 여러 자원을 산정하고 분배할 수 있음

참여자 간에 의사소통의 기준을 정할 수 있고 용어의 표준화를 가능하게 함

개발 진행 상황도 명확히 파악할 수 있고 각 단계별로 생성되는 문서를 포함한 산출물을 활용해 검토할 수 있게 함


9-1. 클래스 설계 원칙 중 클래스를 변경해야 하는 이유는 오직 하나여야 한다는 원칙은?

단일 책임 원칙


9-2. 클래스 설계 원칙 중 확장(속성)에는 열려 있어야 하고 변경에는 닫혀 있어야 한다는 원칙은? 

개방 폐쇄 원칙


9-3. 클래스 설계 원칙 중 상위클래스의 객체는 언제나 자신의 하위클래스의 객체로 교제할 수 있어야 한다는 원칙은?

리스코프 교체 원칙


9-4. 클래스 설계 원칙 중 클라이언트는 구체 클래스가 아닌 추상 클래스(인터페이스)에 의존해야 한다는 원칙은?

의존 관계 역전 원칙


9-5. 클래스 설계 원칙 중 클라이언트는 자신이 사용하지 않는 메서드와 의존 관계를 맺으면 안 된다는 원칙은?

인터페이스 분리 원칙


10-1. 개발 프로세스 모델 중 폭포수 모델에 테스트 단계를 추가하여 확장한 모델로 각 개발 단계를 검증하는데 초점이 맞춰진 모델은?

V 모델


10-2. 개발 프로세스 모델 중 선형 순차적 모델의 대표 모델로 관리가 용이하며, 문서를 체계적으로 할 수 있으며, 요구사항의 변화가 적은 프로젝트에 적합한 모델은?

폭포수 모델


10-3. 개발 프로세스 모델 중 진화적 프로토타입 모델에 위험 분석을 추가한 모델로 사전 위험 분석을 통한 돌출 위험 요소 감소시켜 프로젝트 중단 확률 감소시키고, 사용자 요구가 충분히 반영된 제품을 개발하여 사용자의 불만 감소는 장점을 가지고 있는 모델은?

나선형 모델

11-1. 비용 산정 기법 중 과거 유사 경험을 바탕으로 회의를 통해 산정하는 비과학적인 기법은?

하향식 비용 산정 기법


11-2. 비용 산정 기법 중 상향식 비용 산정 기법이며, 경험적 추정 기법 또는 실험적 추정 기법으로 불리며 대표적으로 COCOMO방법을 사용하는 기법은?

수학적 산정 기법


11-3. 비용 산정 기법 중 세부 작업 단위별로 비용 산정한 후 전체 비용 합산 기법으로 대표적으로 LOC기법을 사용하는 기법은? 

상향식 산정 기법


11-4. 상향식 산정 기법 중 하나로 코딩만 대상으로 산정하는 LOC기법보다 더 정확한 방법은? 

개발 단계별 노력(M/M) 기법


11-5. 수학적 산정 기법 중 하나로 SW 규모(LOC) 추정한 후 SW 종류에 따라 각 비용 산정 공식에 대입하여 비용 산정 방법은? 

 COCOMO 방법


11-6. 수학적 산정 기법 중 하나로 기능 점수를 구한 후 이를 이용해 비용을 산정하는 방법은? 

기능 점수 기반 추정 모델


12-1. 타당성 분석 종류 중 현재의 기술로 사용자가 요구하는 기능을 구현할 수 있는지 검토하는 것은?

기술적 타당성

 
12-2. 타당성 분석 종류 중 시장 분석을 통한 시장성 확인을 통해 개발 여부를 판단하는 것은?

경제적 타당성


12-3. 타당성 분석 종류 중 개발용 소프트웨어와 도구의 사용이 법적으로 문제가 없는지 검토하는 것은?

법적 타당성


12-4. 요구 사항 검증 내용 중 사용자 요구 분석 명세서와 설계서등에서 같은 내용을 쉽게 찾을 수 있는가를 나타내는 요구 분석 명세서의 활동 내용은?

추적 가능성


12-5. 요구 사항 검증 내용 중 사용자가 요구하는 내용과 일치하는지를 검증할 수 있는가를 나타내는 요구 분석 명세서의 활동 내용은? 

검증 가능성


12-6. 요구 사항 검증 내용 중 서로 의존 관계가 적어 변경으로 인해 미치는 영향이 적은지에 대한 요구 분석 명세서의 활동 내용은?

변경 용이성

 

13-1. 간이 기능 점수법을 이용한 기능 점수 산정 방법의 측정 유형 결정 방법 중 응용 규모 측정으로 현재 운용 중인 애플리케이션의 기능을 측정하는 기능 점수는? 

애플리케이션 기능 점수


13-2. 간이 기능 점수법을 이용한 기능 점수 산정 방법의 측정 유형 결정 방법 중 개발 규모 측정으로 프로젝트에서 사용자를 위해 제공된 모든 기능을 측정하는 기능 점수는? 

개발 프로젝트 기능 점수


13-3. 간이 기능 점수법을 이용한 기능 점수 산정 방법의 측정 유형 결정 방법 중 변경 규모 측정으로 사용 중인 소프트웨어 변경이 발생했을 때 변경된 부분의 기능을 측정하는 기능 점수는? 

개선 프로젝트 기능 점수

 

14-1. 응집도 중 함수적 응집이라고도 하며 응집도가 가장 높은 경우로 단일 기능의 요소가 하나의 모듈을 구성하는 응집은?

기능적 응집


14-2. 응집도 중 특별한 이유 없이 몇 개의 모듈로 나누는 과정에서 우연히 같이 묶인 것으로 구성 요소 간에 관련이 별로 없어 응집도가 가장 낮은 응집은?

우연적 응집


14-3. 응집도 중 정보적 응집이라고도 하며, 입력을 사용하는 구성 요소가 하나의 모듈로 구성되어 있고, 구성 요소가 동일한 출력을 만들어 낼 때도 응집되어 요소간의 순서가 중요하지 않은 응집은? 

교환적 응집

 

옳은 것을 표기함
15-1. 아키텍처의 시스템 품질 속성이 아닌 것은?

가용성

변경 용이성

성능

보안성

사용성

테스트 용이성


15-2. 아키텍처의 비즈니스 품질 속성이 아닌 것은?

시장 적시성

비용과 이익

예상 시스템 수명

목표 시장

신규 발매 일정

기존 시스템과의 통합


15-3. 아키텍처의 아키텍처 품질 속성이 아닌 것은?

개념적 무결성

정확성과 완전성

개발 용이성


15-4. 아키텍처의 4+1 관점 중 최종 사용자가 인식하는 시스템의 기능을 의미하며, 정적 표현 방법으로 유스케이스 다이어그램을 사용하는 관점은?

시나리오 관점


15-5. 아키텍처의 4+1 관점 중 시스템의 기능에 관심이 있는 유스케이스 관점과 달리 시스템 내부를 들여다보며, 정적 표현 방법으로 클래스 및 객체 다이어그램을 사용하는 관점은?

논리적 관점


15-6. 아키텍처의 4+1 관점 중 개발자와 시스템 통합자를 위한 것으로 실제 구동 환경을 살펴봄으로써 논리적 관점과 같으며, 동적 표현 방법으로 상태, 순차 다이어그램을 사용하는 관점은?

프로세스 관점


15-7. 아키텍처의 4+1 관점 중 물리적 시스템에서 사용하는 소프트웨어 서브시스템의 모듈이 서로 어떤 연관 관계가 있고 또 설계와 어떻게 연결 관계를 나타내는지 관심이 있으며, 정적 표현 방법으로 컴포넌트 다이어그램을 사용하는 관점은?

개발 관점


15-8 아키텍처의 4+1 관점 중 시스템에서 필요한 하드웨어 환경을 포함해 시스템을 구성하는 처리 장치 간의 물리적인 배치에 초점이 있으며, 정적 표현 방법으로 배치 다이어그램을 사용하는 관점은?

물리적 관점

2025-04-15 17:23:21

아키텍처

  • 필요성
    • 복잡하고 규모가 큰 소프트웨어를 개발하여면 전체적인 구조가 유기적으로 잘 구성되어야 함
    • 잘 정의된 구조의 품질 좋은 소프트웨어를 만들려면 소프트웨어 아키텍처가 필요
    • 아키텍처 설계로 소프트웨어가 어떤 구조이고 어떻게 동작할 것인지를 예측할 수 있으며, 변경에 유연하게 대처 가능
  • 품질 속성
    • 사용성, 이식성, 유지보수 용이성과 같이 이해관계자의 요구사항과 관심사를 반영한 것
    • 시스템 품질 속성 
      • 가용성
      • 변경 용이성
      • 성능
      • 보안성
      • 사용성
      • 테스트 용이성
    • 비즈니스 품질 속성 
      • 시장 적시성
      • 비용과 이익
      • 예상 시스템 수명
      • 목표 시장
      • 신규 발매 일정
      • 기존 시스템과의 통합
    • 아키텍처의 품질 속성
      • 개념적 무결성 (일관성)
      • 정확성과 완전성
      • 개발 용이성 (구축 가능성)

아키텍처의 4 + 1 관점

 

  • 시나리오 (유스케이스) 관점
    • 최종 사용자가 인식하는 시스템의 기능을 의미
    • 시스템이 사용자에게 제공하는 기능에 주목하는 관점
  • 논리적 (디자인) 관점
    • 시스템 내부를 들여다 봄
  • 프로세스 관점
    • 개발자와 시스템 통합자를 위한 것으로 실제 구동 환경을 살펴봄으로써 논리적 관점과 같음
    • 모든 클래스에 관심이 있기보단 독자적인 제어 스레드를 가질 수 있는 클래스에 초점
    • 시스템의 동시성과 동기화에 관심이 있어 어떤 프로세스와 스레드가 있는지 식별하고 관계를 표현
  • 개발 (구현) 관점
    • 물리적 시스템에세 사용하는 소프트웨어 서브시스템의 모듈이 서로 어떤 관계가 있고 또 설계ㅘ 어떻게 연결 관계를 나타내는지에 관심
  • 물리적 (배치) 관점
    • 시스템에서 필요한 하드웨어 환경을 포함해 시스템을 구성하는 처리 장치 간의 물리적인 배치에 초점

 

아키텍처 스타일

 

연관 관계

 

 

일반화 관계

 

 

집합 관계

합성 관계

의존 관계

 

실체화 관계

 

 

클래스 설계 원칙

  • 단일 책임 원칙 : 클래스를 변경해야 하는 이유는 단 하나여야 한다.

  • 개방 폐쇄 원칙 : 변경에는 닫혀 있어야 하고, 확장에는 열려 있어야 한다.

  • 리스코프 교체 원칙 : 상위 클래스의 객체는 언제나 자신의 하위 클래스의 객체로 교체할 수 있어야 한다.
  • 의존 관계 역전 원칙 : 클라이언트는 구체 클래스가 아닌 추상 클래스(인터페이스) 에 의존해야 한다.

  • 인터페이스 분리 원칙 : 클라이언트는 자신이 사용하지 않는 메서드와 의존 관계를 맺으면 안 된다.

 

2025-04-14 23:40:41

안드로이드 커스텀 뷰 요소 만들기

java 코드

package com.inhatc.mobile_programming_practice;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

public class imgAndroiView extends View {

    public imgAndroiView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

 

 

xml 코드

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textAlignment="center"
    tools:context=".MainActivity">

    <com.inhatc.mobile_programming_practice.imgAndroiView
        android:id="@+id/imgAndroiView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:focusable="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/img_androi" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

핵심 포인트

xml 코드의 ImageView를 패키지명.클래스명 으로 설정해주면 커스텀 요소를 사용 가능하다!

 

 

예제 1) 이미지를 화면의 중앙에 오도록 설정하기

 

package com.inhatc.mobile_programming_practice;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.NonNull;

public class imgAndroiView extends View {

    Drawable imgAndroiView;
    int ix, iy, imgWidth, imgHeight;

    public imgAndroiView(Context context, AttributeSet attrs) {
        super(context, attrs);

        imgAndroiView = this.getResources().getDrawable(R.drawable.img_androi);
        imgWidth = imgAndroiView.getIntrinsicWidth();
        imgHeight = imgAndroiView.getIntrinsicHeight();

        ix = 0;
        iy = 0;
    }

    @Override
    public void onDraw(@NonNull Canvas canvas)
    {
        imgAndroiView.setBounds(ix, iy, ix + imgWidth, iy + imgHeight);
        imgAndroiView.draw(canvas);

        super.onDraw(canvas);
    }

    @Override
    public void onSizeChanged(int x, int y, int oldx, int oldy)
    {
        ix = (x - imgWidth) / 2;
        iy = (y - imgHeight) / 2;

        super.onSizeChanged(x, y, oldx, oldy);
    }
}

 

결과

 

핵심 포인트

뷰 요소.getIntrinsicWidth / Height  : 해당 요소의 Width값 / Height 값을 가져오는 메서드

ix = (x - imgWidth) / 2 : 뷰의 중앙에 이미지를 위치시키는 방법.

x 대신 getWidth() 메서드를 사용해도 무관하다.

 

예제 2) 방향키 입력을 통해 이미지 이동시키기

 

java 코드

package com.inhatc.mobile_programming_practice;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class imgAndroiView extends View {

    Drawable imgAndroiView;
    int ix, iy, imgWidth, imgHeight;

    public imgAndroiView(Context context, AttributeSet attrs) { ... }

    @Override
    public void onDraw(@NonNull Canvas canvas)
    { ... }

    @Override
    public void onSizeChanged(int x, int y, int oldx, int oldy)
    { ... }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch(keyCode)
        {
            case KeyEvent.KEYCODE_DPAD_LEFT:
                ix -= 15;
                if (ix <= 0) ix = 0;
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                ix += 15;
                if (ix >= getWidth() - imgWidth) ix = getWidth() - imgWidth;
                break;
            case KeyEvent.KEYCODE_DPAD_DOWN:
                iy += 15;
                if (iy >= getHeight() - imgHeight) iy = getHeight() - imgHeight;
                break;
            case KeyEvent.KEYCODE_DPAD_UP:
                iy -= 15;
                if (iy <= 0) iy = 0;
                break;
        }

        this.invalidate();
        return super.onKeyDown(keyCode, event);
    }
}

 

핵심 포인트

뷰의 좌측 상단이 (0, 0) 이므로 좌측으로 이동하면 x를 감소, 우측으로 이동하면 x를 증가

상단으로 움직이려면 y를 감소, 하단으로 움직이려면 y를 증가시키면 된다.

 

또한 이미지의 좌표도 좌측 상단이 (0, 0) 이므로 우측 혹은 하단으로 나가지 못하게 하려면 조건에 이미지의 두께 / 너비를 더해주어야 한다.

 

예제 3 ) 클릭하면 이미지를 해당 위치로 이동시키기

 java 코드

package com.inhatc.mobile_programming_practice;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class imgAndroiView extends View { ... }

    @Override
    public void onDraw(@NonNull Canvas canvas)
    { ... }

    @Override
    public void onSizeChanged(int x, int y, int oldx, int oldy)
    { ... }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) { ... }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        ix = (int)event.getX();
        iy = (int)event.getY();
        return super.onTouchEvent(event);
    }
}

 

2025-04-11 12:06:11

TCP/IP 프로토콜 스택

 

  • Link 계층
    • 물리적인 영역을 담당
    • LAN의 MAC 프로토콜과 WAN의 L2 프로토콜 영역

 

  • IP 계층
    • 네트워크를 통한 데이터 전송을 담당한다
    • IP 주소를 사용, 경로를 선택해서 목적지로 라우팅함

 

  • TCP/IP 계층
    • TCP에서 IP를 사용하여 데이터 전송
    • IP는 오직 한 패킷의 전송에만 관심을 둠
    • TCP는 데이터의 수신을 확인하는 메커니즘을 사용

 

  • 응용 계층
    • 소켓을 이용한 프로그램의 구현을 의미한다

 

TCP 서버에서의 기본적인 함수 호출 순서

  • 연결 요청 대기 상태로의 진입
  1. listen 함수는 전달되는 인자의 소켓을 서버 소켓이 되세 한다
  2. listen 함수는 연결 요청 대기 큐를 생성한다.

sock : 연결 요청 대기상태에 두고자 하는 소켓의 파일 디스크립터, 디스크립터 소켓의 서버 소켓이 된다

backlog : 연결요청 대기 큐의 크기 정보

 

  • 연결요청 수락하기
  1. 연결요청 대기 큐에 존재하는 클라이언트의 연결 요청 수락

sock : 서버 소켓의 파일 디스크립터

addr : 연결 요청한 클라이언트의 주소 정보를 담을 변수의 주소 값 전달. 함수 호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소 정보가 채워짐

addrlen : addr에 전달된 주소의 변수 크기를 바이트 단위로 전달

 

Iterative 기반의 서버, 클라이언트의 구현

  1. Iterative 서버 : 반복해서 클라이언트의 요청을 처리한다

  1. 에코 서버/클라이언트의 기능 : 클라이언트가 전송해주는 데이터를 그대로 되돌려 전송해주는 기능의 서버

 

 

TCP 기반의 데이터 전송의 특징

  • 한번의 데이터 전송함수 호출이 늘 하나의 패킷을 형성하는 것은 아님
  • TCP는 연결지향 프로토콜로 전송되는 데이터의 경계가 없음
  • 한번에 write()를 사용하여 "ABCD" 문자를 전송할지라도, 그 데이터들이 하나의 패킷을 형성하여 전송되는것은 아님

 

 

'TCP_IP 공부' 카테고리의 다른 글

TCP/IP 7주차 (UDP)  (0) 2025.04.18
TCP_IP 4주차  (0) 2025.03.28
TCP_IP 2차시  (0) 2025.03.21
TCP_IP 1주차  (0) 2025.03.14
2025-04-09 22:57:28

Activity

  • 애플리케이션의 표현 계층
  • UI 구성요소를 스크린에 표시
  • 윈도우 어플리케이션의 Form과 같은 기능을 수행

 

예제 1) 버튼을 눌러 Activity를 전환하기

 

JAVA 소스 코드)

MainActivity.java

package com.inhatc.mobile_programming_practice;

import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TabHost;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button btnCow;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        btnCow = (Button)findViewById(R.id.btnCow);
        btnCow.setOnClickListener(this);

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }
    @Override
    public void onClick(View view)
    {
        if (view == btnCow)
        {
            Intent cowIntent = new Intent(MainActivity.this, CowActivity.class);
            startActivity(cowIntent);
        }
    }
}

CowActivity.java

package com.inhatc.mobile_programming_practice;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class DogActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_dog);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }
}

 

핵심 포인트)

시작)

Intent cowIntent = new Intent(MainActivity.this, CowActivity.class);

startActivity(cowIntent);

 

종료)

finish();

 

 

예제 2) Sound에 텍스트 입력 후 OK 버튼 클릭 시 입력한 텍스트를 toast를 이용하여 출력

MainActivity.java

package com.inhatc.mobile_programming_practice;

import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button btnCow;
    Toast objToast;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        btnCow = (Button)findViewById(R.id.btnCow);
        btnCow.setOnClickListener(this);

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }
    @Override
    public void onClick(View view)
    {
        if (view == btnCow)
        {
            Intent cowIntent = new Intent(MainActivity.this, CowActivity.class);
            startActivityForResult(cowIntent, 1);
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1)
        {
             String strData = data.getStringExtra("Animal_Sound");
             objToast = Toast.makeText(this, strData, Toast.LENGTH_LONG);
             objToast.show();
        }
    }
}

CowActivity.java

package com.inhatc.mobile_programming_practice;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class CowActivity extends AppCompatActivity implements View.OnClickListener{
    Button btnOK;
    EditText editSound;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_cow);

        btnOK = (Button)findViewById(R.id.btnOK);
        btnOK.setOnClickListener(this);

        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }
    @Override
    public void onClick(View view)
    {
        if (view == btnOK)
        {
            Intent CallIntent = getIntent();
            editSound = (EditText)findViewById(R.id.editTextSound);
            CallIntent.putExtra("Animal_Sound", editSound.getText().toString());
            setResult(RESULT_OK, CallIntent);
            finish();
        }
    }
}

 

결과)

 

 

핵심 포인트)

시작)

startActivityForResult(cowIntent,  1);

 

@Override

protected void onAcitivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1) {

        String strData = data.getStringExtra("Animal_Sound");

        objToast = Toast.makeText(this, strData, Toast.LENGTH_LONG);

        objToast.show();

    }

}

 

종료)

CallIntent.putExtra("Animal_Sound", edtSound.getText().toString());

setResult(RESULT_OK, CallIntent);

finish();

 

 

 

 

 

 

 

 

2025-04-08 17:31:15

중간고사 : 객관식 : 4지선다. 3점 20 or 4점 15

                 주관식 : 계산문제 10, 15, 15점

 

설계

분할과 정복

  • 분할 : 큰 소프트웨어 하나를 개발할 때 여러 개의 서브 시스템으로 세분화해 나누는 작업
    • 분할의 기준 : 
      • 분산 시스템은 클라이언트와 서버로 분할
      • 시스템은 여러 서브시스템으로 분할
      • 서브시스템은 하나 이상의 패키지로 분할
      • 패키지는 유스케이스나 여러 클래스로 분할
  • 정복 : 어느 정도 수준까지 분할했다면 말단에 있는 것부터 하나씩 개발하는 작업

 

추상화

  • 과정 추상화
  • 데이터 추상화
  • 제어 추상화

 

캡슐화

정보 은닉

상속

다형성

  • 오버로딩 (중복 정의)
  • 오버라이딩 (재정의)

모듈화

  • 모듈 평가 기준 1 : 응집도
    • 기능적 응집  : 단일 기능의 요소가 하나의 모듈을 구성
    • 순차적 응집 :  두 요소가 하나의 모듈로 구성
    • 교환적 응집 : 입력을 사용하는 구성 요소가 하나의 모듈로 구성
    • 절차적 응집 : 순서가 정해진 몇 개의 구성 요소가 하나의 모듈로 구성된 경우
    • 시간적 응집 : 모듈 내 구성 요소의 기능이 각기 다르고 요소의 출력을 입력으로 사용하는 것고, 요소 간에 순서가 정해진 것도 아님
    • 논리적 응집 : 구성 요소 간에 공톤점이 있거나 관련된 임무가 존재하거나 기능이 비슷해서 하나의 모듈로 구성된 경우
    • 우연적 응집 : 구성 요소들이 우연히 모여 구성

 

  • 모듈 평가 기준 2 : 결합도
    • 데이터 결합
    • 스탬프 결합
    • 제어 결합
    • 공통 결합
    • 내용 결합

 

2025-04-08 15:43:32

퍼셉트론 (Perceptron)

 

예제1) 입력이 (1, 0), w1 = 1, w2 = 1, b = -1.5 일 경우의 y의 값은? (계단 함수는위의 그림을 참조)

 

x1*w1 + x2*w2 + b = 1*1 + 0*1 -1.5 = -0.5

y = 0

 

예제 2) 입력이 (1, 1), w1 = 1, w2 = 1, b = -1.5 일 경우의 y의 값은?

 

x1*w1 + x2*w2 + b = 1*1 + 1*1 -1.5 = 0.5

y = 1

 

예제 2) 입력이 (1, 1), w1 = 1, w2 = 1, b = -0.5 일 경우의 y의 값은?

 

x1*w1 + x2*w2 + b = 1*1 + 1*1 -0.5 = 1.5

y = 1

 

퍼셉트론의 논린 연산

  • AND 연산
x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

 

epsilon = 0.0000001

def perceptron(x1, x2):
  w1, w2, b = 1.0, 1.0, -1.5
  sum = x1 * w1 + x2 * w2 + b
  if sum > epsilon :
    return 1
  else :
    return 0

print(perceptron(0, 0))
print(perceptron(1, 0))
print(perceptron(0, 1))
print(perceptron(1, 1))
 
결과 : 0
          0
          0
          1

 

퍼셉트론도 scikit에서 학습이 가능하다!

from sklearn.linear_model import Perceptron
X = [[0, 0], [1, 0], [0, 1], [1, 1]]
y = [0, 0, 0, 1]

clf = Perceptron(tol=1e-3, random_state=0)

clf.fit(X, y)

print(clf.predict(X))
 
결과 : [0 0 0 1]

 

  • OR 연산
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1
from sklearn.linear_model import Perceptron
X = [[0, 0], [1, 0], [0, 1], [1, 1]]
y = [0, 1, 1, 1]

clf = Perceptron(tol=1e-3, random_state=0)

clf.fit(X, y)

print(clf.predict(X))
 
결과 : [0, 1, 1, 1]

 

  • XOR 연산

 

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0
from sklearn.linear_model import Perceptron
X = [[0, 0], [1, 0], [0, 1], [1, 1]]
y = [0, 1, 1, 0]

clf = Perceptron(tol=1e-3, random_state=0)

clf.fit(X, y)

print(clf.predict(X))
 
결과 : [0, 0, 0, 0]

 

퍼셉트론으로 XOR문제를 해결할 수 없다.

이를 해결하기 위해 다층 퍼셉트론이 필요하다.

 

행렬 곱셈

 

예제 1)

 

) 1*3 + 2*2 + 3*1 = 10

2) 1*2 + 2*0 + 3*3 = 11

3) 1*1 + 2*3 + 3*1 = 10

 

 

활성화 함수 

계단 함수는 입력 신호의 총합이 0을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력하는 함수이다

 

  • 활성화 함수 (시그모이드)

  • 활성화 함수 (Rectifed Linear Unit function)

  • 활성화 함수 (Tanh)

 

 


다층 퍼셉트론 

입력층과 출력층 사이에 은닉층이 존재

 

 

순방향 패스

  • 입력 신호가 입력층 유닛에 가해지고, 이들 입력 신호가 은닉층을 통하여 출력층으로 전파되는 과정

역방향 패스

  • 신경망 내부의 가중치는 오차 역전파 방법을 사용해 수정

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'인공지능 공부' 카테고리의 다른 글

인공지능 9주차 (keras)  (1) 2025.05.02
인공지능 5주차  (0) 2025.04.01
인공지능 2차시  (0) 2025.03.18
인공지능  (0) 2025.03.18