전체 글 (165)
2025-03-19 22:19:07

람다식

  • 일회성 메서드로 익명 메서드 라고도 함
  • (num) => {Console.WriteLine(num); }; 람다식의 기본 구성

 

델리게이트

  • 메서드를 저장하는 변수
  • += 로 델리게이트 안에 메서드를 저장할 수 있음
  • -= 메서드명 으로 델리게이트 안의 특정 메서드를 제거할 수 있음
  • = 를 사용하면 델리게이트를 모두 비운 뒤 해당 메서드를 저장함
using System;
using System.Collections.Generic;
using System.Text;

namespace Baekjoon4383
{
    internal class Program
    {
        public delegate void MyDele(int func);
        static public MyDele dele;    
        static void Main(string[] args)
        {
            dele += Function;

            dele(2);
        }
        static void Function(int num)
        {
            Console.WriteLine(num);
        }
    }
}
  • 델리게이트 인스턴스 멤버에 넣을 수 있는 메서드의 반환형, 매개변수의 자료형, 개수는 모두 동일해야 한다.
  • 델리게이트 선언할 때 정한 메서드만 넣어야 한다
  • Invoke();
    • 델리게이트에 ? 을 붙인 후 사용하면 델리게이트가 null인지 검사한 뒤 null이 아닌 경우에만 매개변수는 delegate에 넘긴뒤 실행시켜줌.
    • dele?.Invoke();

 

액션

  • 사스템에서 기본적으로 제공하는 델리게이트
  • 반환값이 없으며, 매개변수 또한 없다.
  • 안의 메서드들을 실행시키는 역할

 

이벤트

  • 델리게이트의 앞에 달 수 있음.
  • event가 달려있다면 다른 스크립트에서 메서드를 추가, 빼기는 가능하지만, 초기화, 실행은 불가능해진다

 

콜백 메서드

  • 비동기 메서드로 인해 메서드의 실행 순서를 확실하게 하지 못할 때 실행 순서를 조정하기 위해 사용.
  • 비동기 메서드 실행 이후 실행하고 싶은 메서드를 인수로 보내면, 비동기 메서드의 비즈니스 로직 처리 이후 해당 메서드 실행
2025-03-18 18:21:31

여기서 시험문제 많이 나올거래요

바용 산정 문제의 배점이 크게 나올 예정

 

계획

  • 소프트웨어 개발의 성패는 비용, 기간, 인력과 같은 자원을 토대로 초기에 얼마나 계획을 잘 세우느냐에 달려있음

문제 정의

  • 문제를 정의하려면 개발하고자 하는 영역의 배경 지식이 필요
  • 유사한 프로젝트를 개발한 경험이 있는 분석가가 참여하는 것이 도움이 됨
  • 문제를 파악하기 위해 현재 운영 중인 시스템을 사용해 보고
  • 실무 담당자와 면담해 자료를 수집한 후 면밀히 분석해보는 것이 필요

타당성 분석

경제적 타당성

  • 경영자 입장에서 의사결정을 하는 데 매우 중요한 요소
  • 시장 분석을 통해 시장성을 확인
  • 경제적 타당성 분석으로 투자 효율성과 시장성을 검증한 후 개발 여부를 판단

기술적 타당성

  • 사용자가 요구하는 프로젝트가 최신 기술이 필요하다면 기술적 타당성을 먼저 검토
  • 요구하는 기술을 회사가 가지고 있는지 확인
  • 부족하다면 필요한 기술을 갖고 있는 소프트웨어 개발자를 채용하거나 외주 개발로 해결

법적 타당성

  • 오픈소스는 소프트웨어 분쟁 발생 소지가 높음
  • 법적인 문제가 발생하지 않으려면 오픈소스를 사용할 때 어디까지 무료로 사용할 수 있는지 확인해야 함

개발 비용 산정 : 하향식

전문가 판단 기법 (계산식에 관련된 문제 출제 예정)

  • 경험이 많은 여러 전문가가 프로젝트를 수행하는 데 비용이 어느 정도 들어가는지 평가한 금액을 개발 비용으로 산정
  • 경험이 많은 전문가가 판단을 내린 만큼 신뢰성이 있고 편리하다는 장점
  • 짧은 시간에 개발비를 산정하거나 입찰에 응해야 하는 경우 많이 사용
  • 수학적 계산에 의해 산정하지 않고 경험에만 의존할 경우 부정확할 수 있음

델파이 기법

  • 전문가의 경험을 중요시해 비용을 산정하는 것은 같으나 전문가들의 편견이나 분위기에 영향을 받지 않도록 조정자를둠
  • 여러 전문가가 모여 각자의 의견대로 비용을 산정 후 결과를 공유하고 의견을 조율하여 개발 비용을 산정
    1.  조정자는 전문가가 모여 비용 산정을 하는 회의에서 간사 역할을 수행
    2. 던문가는 비용을 산정할 수 있는 자료를 충분히 검토하고, 필요하다면 의견을 나눌 수 있음
    3. 전문가 각자가 비용을 산정한다. 이떼 계산된 결과를 조정자에게 익명으로 제출
    4. 조정자는 각 전문가가 제출한 자료를 요약 정이
    5. 조정자는 각 전무가가 제출한 자료에서 산정 내용에 차이가 크면 이 문제를 해결하기 위해 회의를 소집
    6. 전문가는 다시 익명으로 비용 산정 작업을 실시

 

개발 비용 산정 : 상향식

원시 코드 라인 수 기법 - LOC 기법

  • 소프트웨어 각 기능의 원시 코드 라인 수 (LOC)의 비관치, 낙관치, 중간치를 측정하여 예측치를 구하고 이를 이용해 노력, 개발 비용, 개발 기간. 생산성 등의 비용을 산정하는 기법

  • 한 모듈에 대해 라인 수 (LOC)를 추정할 때 낙관적으로 볼 때 300LOC, 비관적으로 볼 때 900LOC, 중간이라고 볼 때 600LOC로 생각했다면, 추정  LOC는 얼마인가?
  • (300 + (4 * 600) + 900) / 6 = 600LOC

  • 소프트웨어 개발 기간은 1년(12개월)이다. 5명의 개발자가 12개월 동안, 7명의 개발자가 5개월 동안 참여한다면 이 소프트웨어 개발의 노력M/M는 얼마인가?
  • (5명 * 12개월) + (7명 * 5개월) = 60M/M + 35M/M = 95M/M
  • LOC 기법에 의해 예측한 총 라인이 50,000라인이고, 개발자가 10명 참여한다. 그리고 개발자들이 월 평균 500라인 을 코딩 한다면 개발 기간은 얼마나 되는가?
  • 노력(M/M) = 원시 코드 라인 수 / 1인당 월 평균 생산 코드 라인 수 = 50,000 라인/500라인 = 100M/M
    개발 기간 = M/M / 참여 인원 = 100M/M / 10명 = 10개월

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

  • LOC 기법은 개발하려는 소프트웨어의 총 코드 라인 수를 예측하여 구현 단계에 대한 M/M를 산정
  • 하지만, 실제 소프트웨어를 개발하디 위해서는 코딩 뿐만 아니라 요구 분석, 설계 등의 단계에서도 인력과 자원이 많이 필요
  • M/M을 소프트웨어 개발 생명주기의 각 단계에 적용하여 단계별로 산정 -> LOC기법 보완
  • 코딩만 대상으로 산정하는 LOC 기법보다 더 정확

 

비용 산정 기법 : 수학적 산정 기법

COCOMO 방법

  • 프로그램 유형에 따른 가중치를 두어야 함
  • 개발아려는 소프트웨어를 제품, 컴퓨터, 개발자, 프로젝트 4가지 특성에 따라 총 15가지로 분류한 후 인건비를 더 보정

가중치 반영하기

  • 단순형 프로젝트 : 50KDSI 이하
  • 중간형 프로젝트 : 300KDSI 이하
  • 내장형 프로젝트 : 300KDSI 이상

보정 계수 반영하기

  • 노력 조정 수치(EAF) : 보정에 사용하는 값, 필요한 각 항목별 승수 값을 모두 곱한 값

노력 조정 수치가 반영된 노력 (P/M)

  • 노력 조정 수치가 반영된 노력(PM) : 프로젝트 유형에 노력 조정 수치를 곱한 것

기능 점수 산정 방법

간이 기능 점수법

  • 프로젝트 초기 단계에서 각 기능의 요소를 모르는 경우에 평균 복잡도 가중치를 사용해 소프트웨어 기능의 크기를 측정

  • 평균 복잡도 가중치

  • 데이터 기능 점수 계산
    • 이번 프로젝트에서 생성해 관리하는 데이터는 내부 논리 파일(ILF)
    • 이번 프로젝트에서 만들지 않고 다른 프로젝트에서 생성했으나 이번 프로젝트에서 참조하는 데이터는 외부 연계 파일(EIF)
    • 데이터 기능 점수는 내부 논리 파일의 개수와 외부 연계 파일의 개수에 각각의 평균 복잡도(가중치)를 곱해 계산
  • 트랜잭션 기능 점수 계산
    • 기능 점수에서 트랜잭션 기능의 복잡도는 입력, 출력, 조회의 개수로 결정
    • 외부 입력 (EI) :  데이터베이스에 데이터를 등록하거나 수정.삭제하는 것
    • 외부 출력 (EO) : 계산하는 로직을 거쳐 데이터나 제어 정보를 사용자에게 보여주는 기눙
    • 외부 조회 (EQ) :  로직이 필요 없고 데이터베이스에 존재하는 데이터를 찾아 그대로 표시만 해주는 기능

  •  

 

 

일정 계획

일정 계획 기법 1 : 네트워크 차트 (PERT/CPM)

CPM 작업 과정

  • CPM으로 네트워크를 그리려면 학사관리 애플리케이션을 수행하는 데 필요한 작업, 선행 작업, 작업의 소요 기간이 필요

 

 

 

2025-03-18 15:52:21

Numpy

  • 고성능의 수치 계산을 위한 라이브러리
  • 넘파이 라이브러리는 다차원 데이터 구조가 포함되어있다.
  • 넘파이는 데이터 전처리 및 다양한 수학적인 행렬 연산을 수행하는데 사용할 수 있다.
  • import numpy as np

 

딥러닝에서 넘파이가 중요한 이유

  • 학습 데이터는 2차원 행렬이나 3차원 행렬에 저장된다.

 

import numpy as np
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

print(a.shape) # 배열의 형상
(3, 3)

print(a.ndim) # 배열의 차원 개수 
2

print(a.dtype) # 요소의 자료형
int64

print(a.itemsize) # 요소 한 개의 크기
8

print(a.size) # 전체 요소의 개수
9

np.zeros( (3, 4) ) # 내용을 0으로 3행 4열의 2차원 배열 생성
 array([[ 0.,  0.,  0.,  0.],
 [ 0.,  0.,  0.,  0.],
 [ 0.,  0.,  0.,  0.]])

np.ones( (3, 4) ) # 내용을 1로 3행 4열의 배열 생성
array([[1, 1, 1, 1],
 [1, 1, 1, 1],
 [1, 1, 1, 1]])

np.eyes(3) # 대각선 3열 3행의 3차원 배열 생성 후, 주대각선의 값만 1로, 나머지는 0으로 지정.
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])


np.arange(5) # 0부터 시작하여 5 이전까지의 값을 가지는 1차원 배열 생성
 array([0, 1, 2, 3, 4])
 
 np.arange(1, 6)
 array([1, 2, 3, 4, 5])
 
 np.arange(1, 10, 2) # 1부터 10 이전까지 값을 2씩 증가시키며 값을 채워넣음
 array([1, 3, 5, 7, 9])
 
 x = np.array([[1, 2], [3, 4]])
 y = np.array([[5, 6], [7, 8]])
 
 np.concatenate((x, y), axis=1)  # 두 배열끼리 차수가 맞는 배열만 합침
 array([1, 2, 5, 6],[3, 4, 7, 8])

 

예제

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print("문제 1 : ", a[1][2])  # 6
print("\n문제 2 : ", a.shape)  # (3, 3)
print("\n문제 3 : ", a.size)   # 9

print("\n문제 4 : \n", np.zeros((4, 2)))  # array([[0., 0.], [0., 0.], [0., 0.], [0., 0.]])

print("\n문제 5 : \n", np.arange(3, 12, 2))  # array([3, 5, 7, 9, 11])

x = np.array([[1, 2, 3], [4, 5, 6]])
y = np.array([[7, 8, 9], [10, 11, 12]])
print("\n문제 6 : \n", np.concatenate((x, y), axis=1))  # array([[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]])
print("\n문제 7 : \n", np.concatenate((x, y), axis=0))  # array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print("\n문제 8 : \n", np.vstack((x, y)))               # array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

a = np.arange(10)
print("\n문제 9 : \n", a.reshape(5, 2))  # array([[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]])
print("\n문제 10 : \n", a.reshape(2, -1)) # array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])

a = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print("\n문제 11 : ", a.shape) 

a1 = a[np.newaxis, :]
print("\n문제 12 : \n", a1)       # array([[1, 2, 3, 4, 5, 6, 7, 8]])
print("\n문제 13 : ", a1.shape)   # (1, 8)

a2 = a[:, np.newaxis]
print("\n문제 14 : \n", a2)       # array([[1], [2], [3], [4], [5], [6], [7], [8]])
print("\n문제 15 : ", a2.shape)   # (8, 1)

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

인공지능 9주차 (keras)  (1) 2025.05.02
인공지능 6주차  (0) 2025.04.08
인공지능 5주차  (0) 2025.04.01
인공지능  (0) 2025.03.18
2025-03-18 13:52:05

딥 러닝 ⊂ 머신 러닝 ⊂ 인공 지능 

 

  • 인공 지능 
    • 인간이 가진 지적 능력을 컴퓨터를 통해 구현하는 기술
  • 머신 러닝 
    • 데이터와 알고리즘을 통해 컴퓨터를 학습시켜 인공 지능의 성능을 향상 시키는 기술
  • 딥 러닝
    • 신경망을 이용한 머신 러닝 방법
    • 여러 층으로 이루어진 신경망을 사용

 

머신러닝의 종류

  • 지도 학습 : 입력과 출력(정답)을 학습 데이터로 제공
    • 회귀 : 입력과 출력이 모두 실수
      • Linear
      • polynomial
    • 판단트리
    • 랜덤 포리스트
    • 분류
  • 비지도 학습 : 정답이 주어지지 않고, 입력 데이터에서 패턴을 찾는 학습
    • 클러스터링
  • 강화 학습

 

머신 러닝의 과정 

  • 학습 데이터 모으기 ★
  • 학습 데이터 정제하기 ★
  • 모델 학습하기
  • 평가
  • 예측

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

인공지능 9주차 (keras)  (1) 2025.05.02
인공지능 6주차  (0) 2025.04.08
인공지능 5주차  (0) 2025.04.01
인공지능 2차시  (0) 2025.03.18
2025-03-17 19:20:19

프로젝트 생성

  • 애플리케이션 이름
    • Project명 ( 공백 없이 입력 )
    • 응용 프로그램 명
  • 회사 도메인
    • user.companyname.com
  • 패키지 이름
    • 2단계 이상 입력
    • com.companyname.appname
      • 폴더 생성 구조 : com\companyname\appname
  • Activity 생성
    • 클래스명 ( 공백 없이 입력 )

 

안드로이드 앱 개발 프로세스

 

 

 

안드로이드 프로젝트 구조

 

  • 안드로이드 프로젝트 파일
File Function
.gradle Build 환경 설정
.idea Copyright, Scope 등 설정
app App관련 source, resource 파일
컴파일 후 생성되는 class 파일
gradle Gradle wrapper는 적절한 Gradle binary를 자동으로 다운로드 해주는 기능
.gitignore Git 에서 Project 별 ignore할 필요가 있는 파일 및 폴더 설정
build.gradle module의 build 방법이 정의 된 script
build에 사용할 SDK 버전, 애플리케이션 버전, 라이브러리 등 설정
gradle.properties Gradle 속성 저장
gradlew Gradle wrapper를 통해 빌드를 진행하기 위한 script
gradlew.bat Gradle wrapper를 통해 빌드를 징행하기 위한 script
local.properties Android SDK 폴더 지정
settings.gradle Gradle 설정

 

  • 안드로이드 app 폴더
Folder Function
app build generated assets 외부데이터 (DB, raw data) 저장
res Resource 파일
source R file
intermediates apk *.apk 파일/ *.json 파일
assets 외부 데이터 ( DB, raw data ) 저장
dex dex file
javac Classes 파일
manifest 애플리케이션을 구성하는 기본요소인 Activity, Sercice, Content Provider, Intents, Broadcast Reciver, Notifications를 정의하고 그 메타데이터들을 제공하는 XM: 문서 파일
outputs logs log file
lib      
src main java Mainactivity.java 파일 저장
res Resource 파일 저장

 

textView의 문자열을 "Welcome to my android world!"로 변경하기

 

source code)

<?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"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Welcome to my Android World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

result )

 

 

 

Java 코드로 TextView의 속성을 변경하기

 

source code)

package com.inhatc.mobile_programming_practice;

import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
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 {

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

        TextView objTV = findViewById(R.id.textView);
        objTV.setText("Android Programming!");
        objTV.setTextColor(Color.BLUE);
        objTV.setGravity(Gravity.CENTER);
        objTV.setTextSize(32);

        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;
        });
    }
}

 

result )

 

Edit Text 속성을 사용하기

 

source code)

<?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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        android:text="Google : "
        android:editable="true"
        android:layout_marginTop="146dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

OR

package com.inhatc.mobile_programming_practice;

import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
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 {

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

        TextView objET = findViewById(R.id.editText);
        objET.setText("Google : ");
        objET.setGravity(0x01);

        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;
        });
    }
}

 

result )

 

source code)

package com.inhatc.mobile_programming_practice;

import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
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 {

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

        TextView objET = findViewById(R.id.editText);
        objET.setText("Google : ");
        objET.setGravity(0x01);

        String str = objET.getText().toString();
        objET.setText(str + "Android Programming");

        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;
        });
    }
}

 

result )

 

2025-03-14 11:23:37

통신 

지점에서 지점으로 전보를 보내는 것

 

데이터를 보내는 방법

  • 1 :  1 통신 => 1개의 지점에서 1개의 지점으로 정보를 보내는 방법
  • 1 : N 통신 => 1개의 지점에서 여러 장치로 데이터를 보내는 방법
    • 서버 : 데이터를 보내는 장치
    • 클라이언트 : 데이터를 수신하는 장비
    • 피어 투 피어 : 클라이언트와 서버 기능이 모두 가능한 네트워크 구조

 

네트워크를 구축하는 방법 

물리적 전송 선로를 이용하는 방법 => 1 : 1 통신

물리적 전송 선로 + 논리적 장치 구분에 의한 데이터 전송 방법 => 1:n 통신으로 1개의 물리적 전송 선로에 복수개의 통신 장치들이 연결되어 논리적 주소를 이용하여 데이터를 주고받는 방법

 

 

직렬 통신 - 시리얼 통신

데이터를 한 번에 1bit 씩 보내는 방식이다. 통로가 1개라서 비용이나, 자원이 크게 들지는 않는다. 또한 하나의 선만을 사용하기 때문에 하드웨어적으로 매우 간편해서 만들기가 쉽다. 하지만 데이터를 모으고 취합하는 과정을 구현해주어야 한다

 

병렬 통신

한번에 8 ~ 16bit에 해당하는 bit를 보내는 방식이다. 여러 개의 정보를 동사에 보내기 때문에 통로가 많아야 해 비용이나 자원이 크게 든다. 선이 많기 때문에 하드웨어적 구현 측면에서 시리얼보다 불편한다.

 

 

시리얼 통신의 방식

동기식 시리얼 통신

각각의 PC가 이러한 신호 주기로 보내겠다는 Clock을 정하고 데이터를 전송하는 방법이다. 그렇기 때문에 데이터를 보내는 데이터 선 말고도 클럭 주기를 맞추는 클럭선이 하나 더 필요하다. 미리 보내는 Clock을 맞추고 데이터를 주고받기 때문에 오류가 적고, 빠르게 데이터를 통신할 수 있다.(SPI 통신 방식) 

 

비동기식 시리얼 통신

비동기식 시리얼 통신을 따로 주기를 정하지 않고, 시작과 끝을 알려주고 전송하는 방법이다. 데이터 선만 있으면 되기 때문에 단순하고 빠르게 통신 회선을 구성할 수 있다. 하지만 동기 시리얼 통신에 비해 안정성이나 속도가 느리다.

 

통신 규격 : RS-22, RS-422, RS-485

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

TCP_IP 11주차  (0) 2025.05.16
TCP/IP 7주차 (UDP)  (0) 2025.04.18
TCP_IP 6주차  (1) 2025.04.11
TCP_IP 4주차  (0) 2025.03.28
TCP_IP 2차시  (0) 2025.03.21
2025-03-11 18:21:55

소프트웨어의 정의

  • 프로그램 : 프로그래밍한 원시 코드(source code)
  • 소프트웨어 : 프로그램 뿐만 아니아 그 이상의 것도 포함하는 매우 포괄적인 개념

 

 

소프트웨어의 분류★

  • 관리 소프트웨어 :
    • 자료를 받아들여 가공한 후 정보를 제공하는 소프트웨어
    • 주로 DB에 자료를 저장한 후 검색을 통해 사용자가 원하는 형태로 정보를 제공 ( 인터넷 뱅킹, 종합정보 시스템, 예약 시스템 등)
  • 제어 소프트웨어 :
    • '각종 센서를 이용하거나 기기들의 동작을 제어하는 소프트웨어 ( 교통 신호 제어, 의료기기 제어, 공장장비 제어 등)
    • 사용자 메뉴얼
  • 임베디드 소프트웨어 
    • 장비나 기기에 내장된 형태의 소프트웨어 ( 가전제품 내의 소프트웨어, 각종 공정제어 시스템 네의 소프트웨어)
    • 변경이 어려뭄
    • 개발방법과 프로세스가 달라 별도 분야로 취급
  • 주문형 소프트웨어
    • 특정 고객의 수요를 만족하기 위해 개발된 소프트웨어
    • 웹사이트, 항공 - 교통 제어 시스템, 재정관리 시스템 등
  • 패키지형 소프트웨어
    • 일반적으로 공개된 시장에서 판매, 범용 소프트웨어라고도 함
    • 주문형 대비 저렴하고 신뢰도가 높지만, 특정 기관의 요구에 맞지 않을 수 있음
  • 리얼타임 소프트웨어
    • 제어, 모니터링 소프트웨어
    • 신속한 반응, 안정성 확보가 매우 중요
  • 자료처리 소프트웨어
    • 비즈니스 업무 처리에 사용
    • 자료의 정확성과 보안이 관건
    • 일괄 처리
  • 두 가지 성격 (리얼타임 + 자료처리)을 동시에 지닌 소프트웨어
    • 전화 통신 시스템 : 전화는 리얼타임, 청구는 자료처리

 

소프트웨어의 특징

  • 제조가 아닌 개발
    1. 제조 : 개인 능력에 따라 차이가 크지 않으므로 능력에 따른 결과물의 차이는 크지 않음
    2. 소프트웨어 개발 과정은 제조와 달리 개인 능력에 따라 차이가 큼
  • 소모가 아닌 품질 저하
    • 하드웨어 : 오래 사용하면 부품이 닳고 기능도 떨어짐
    • 소프트웨어 : 닳지 않으며 또한 시간이 지나도 고장 빈도가 높지 않음, 사용 시작 단계부터 사용자의 요구가 계속 발생

 

소프트웨어의 당면 과제

  • 소프트웨어 개발의 느린 발전 속도
    • H/W의 발전 : PC 및 스마트 폰의 발전 속도(크기, 속도, 성능)
    • S/W의 발전 속도 : DOS ~ Windows 11
  • 새로운 소프트웨어에 대한 사용자의 요구의 증가
    • S/W의 발전 속도가 미처 따라가지 못함
    • H/W와 S/W의 개발 방법의 근본적인 차이 때문
    • (해결 방안) CBD 개발 방법론

 

소프트웨어 공학

  • 소프트웨어 공학의 학문적 정의 :
    • 품질 좋은 소프트웨어를 경제적으로 개발하기 위해 계획읳 세우고, 새발하며, 유지 맟 관리하는 전 과정에서 공학, 과학 및 수학적 원라와 방법을 적용해 필요한 이론과 기술 및 도구 들에 관해 연수하는 학문 → 소비자가 만족해야

 

 


 

 

주먹구구식 모델 - Build & fix, Code & fix, 즉흥적 소프트웨어 개발 모델

  • 공식적인 가이드라인이나 프로세스가 없는 개발 방식
  • 즉흥적 소프트웨어 개발 꼬는 코딩과 수정 모델이라고 함
  • 코드를 작성해 제품을 만든 후에 요구분석, 설계, 유지보수에 대해 생각
  • 첫 번째 버전의 코드를 작성해 제품을 완성한 귀 작성된 코드에 문제가 있으면 수정해서 해결하고 문제가 없으면 사용

 

주먹구구식 모델의 단점

  • 정해진 개발 순서나 각 단계별로 문서화된 산출물이 없어 관리 및 유지보수가 매우 어려움
  • 프로젝트 전체 범위를 알 수 없을 뿐더러 좋은 아키텍퍼를 만들 수도 없음
  • 개발자가 일을 효과적으로 나눠 할 수도 없음
  • 프로젝트 진척 상황을 거의 파악할 수 없음
  • 코딩을 먼저 하므로 수정할 가능성이 많은데, 여러 번 수정하다 보면 사독성이 높았던 프로그램의 구조가 나빠져 수정이 매우 어려워짐

 

선형 순차적 모델 - Classic life cycle

  • 폭포에서 물이 떨어지듯이 다음 단계로 넘어가는 모델
  • 소프트웨어 공학의 대명사로 여겨질 만큼 초기에 개발된 전통적인 모델
  • 공장 생산 라인의 작업 프로세스와 유사한데, 표준 프로세스를 정해 소프트웨어를 순차적을로 개발

 

폭포수 모델의 개발 절차

  • 폭포의 물이 위에서 아래로 떨어지듯이 계획, 분석, 설계,  구현, 테스트, 유지보수의 각 단계가 하향식으로 진행
  • 각 단계가 끝날 때 마다 확실히 매듭을 짓고 그 결과를 확인한 후에 다음 단계로 나아감

 

V 모델

  • 폭포수 모델의 변형으로, 테스트 단계를 추가 확장해 테스트 단계가 분석 및 설계와 어떻게 관련되어 있는지를 나타냄
  • 폭포수 모델이 산출물 중심이라면, V 모델은 각 개발 단계를 검증하는 데 초점을 두므로 오류를 줄일 수 있음

 

단계적 개발 모델

  • 개발자가 먼저 릴리스 1을 개발해 사용자에게 제공하면 사용자가 이를 사용
  • 사용자가 릴리스 1을 사용하는 동안 개발자는 다음 버전인 릴리스 2를 개발
  • 개발과 사용을 병행하는 과정을 반복해 진행하면서 완료
  • 릴리스를 구성하는 방법에 따라 점증적 개발 방법과 반복적 개발 방법으로 나뉨

점증적 개발 방법 : 개발 범위의 증가

  • 중요하다고 생각되는 부분부터 차례로 개발한 후 그 일부를 사용하면서 개발 범위를 점차 늘려 가는 방식
  • 돈이 부족 할 경우 사용하기도함
  • 점증적 방법 - 소프트웨어 개발
    • 요구분석 명세서에 명시된 시스템 전체를 기능에 따라 독립성 높은 서브 시스템으로 분할
    • 각 서브 시스템을 단계적으로 하나씩 릴리스 해 완성하는 방법
  • 점증적 방법의 장점과 단점
    • 한꺼번에 많은 비용을 들이지 않아도 됨

반복적 개발 방법 : 품질의 증가

  • 초기에 시스템 전체를 일차적으로 개발해 인도한 후, 각 서브 시스템의 기능과 성능을 변경 및 보강해 완성도를 높임
  • 초기의 요구사항이 불분명한 경우에 적합

 

통합 프로세스 모델

  • 폭포수 모델은 각 단계별로 깔끔하게 정리되어 있지만 사용자의 요구사항이 많으면 민첩하게 대처할 수 없음
  • 폭포수 모델의 문제점을 해결하기 위해 작업을 계속해서 반복 수행하는 반복적 개발 방법론이 등장
  • 통합 프로세스 모델은 반복적 생명주기를 기반으로 하는 모델 중 가장 많이 사용

통합 프로세스 모델의 절차

  • 통합 프로세스 모델의 개발 과정은 크게 4단계 (도이브 구체화, 구축, 전이)로 나뉨
  • 도입 단계
    • 구현, 테스트, 배치 작업은 거의 없고 '비즈니스 모델링'과 요구사항 정의' 관련 작업이 가장 많이 이루어짐
  • 구체화 단계
    • 비즈니스 모델링과 요구사항 정의 작업은 점차 줄고, 대신 분석 및 설계 작업이 크게 이루어짐
    • 설계 결과에 따른 구현(코딩) 작업, 구현에 대한 단위 테스트가 조금씩 시작
  • 구축 단계
    • 구현 작업이 가장 많이 이루어짐
    • 비즈니스 모델링과 요구사항 정의 작업은 점차 줄고, 분석 및 설계 작업도 구체화 단계보가 줄어듦
  • 전이 단계
    • 이행 단계라고도 하며 사용자를 위한 제품을 완성하는 단계
    • 완성된 제품을 사용자에게 넘겨주는 과정에서 수행해야 할 일을 수행

애자일 프로세스 모델

  • 고객의 요구에 민첩하게 대응하고 그때그때 주어지는 문제를 풀어나가는 방법론
  • 가벼운 프로세스 방법론의 공통적인 특성을 정의

애자일의 기본 가치

  • 프로세스와 도구 중심이 아닌, 개개인과의 상호 소통을 중시
  • 문서 중심이 아닌, 실행 가능한 소프트웨어를 중시
  • 계약과 협상 중심이 아닌, 고객과의 협력을 중시

애자일의 원칙

  • 최우선적인 목표는 고객을 만족시키기 위해 가치 있는 소프트웨어를 빨리, 지속적으로 제공하는 것
  • 동작 가능한 소프트웨어를 짧으면 2주, 길면은 2개월 간격으로 자주 고객에게 전달. 

애자일 프로세스 모델 : 스크럼

  • 소프트웨어 개발 보다는 팀의 개선과 프로젝트 관리에 중점을 둔 애자일 방법론
  • 경험적 관리 기법 중 하나
  • 구체적인 프로세스를 명확하게 제시하지 않음
2024-11-25 02:47:25

패키지

관련있는 프로시저나 함수를 묶어 관리, 운영하는 기능

 

명세부

  • Create [Or Replace] Package 패키지 명
    IS
     Procedure 프로시저 명
     Functino 함수 명
    ......
    END;

 

몸체부

  • Create [Or Replace] Package Body 패키지 명
    IS
     Procedure 프로시저 명
    -프로시저 생성

     Functino 함수 명
    - 함수 생성
    ......
    END;

실행

  • EXECUTE [패키지명].[프로시저/함수 명];

 

ex)

<명세부>

CREATE OR REPLACE PACKAGE PACK1 is
procedure test2
(v_stu_no in student.stu_no%type,
v_stu_grade in student.stu_grade%type);
function test6
(v_enr_grade in number)
return char;
end;

 

<몸체부>

CREATE OR REPLACE PACKAGE BODY PACK1 IS
    PROCEDURE test2 (
        v_stu_no IN student.stu_no%TYPE,
        v_stu_grade IN student.stu_grade%TYPE
    ) IS
    BEGIN
        UPDATE student
        SET stu_grade = v_stu_grade
        WHERE stu_no = v_stu_no;
    END test2;

    FUNCTION test6 (
        v_enr_grade IN NUMBER
    ) RETURN char IS
        enr_score char;
    BEGIN
        IF v_enr_grade >= 90 THEN
            enr_score := 'A';
        ELSIF v_enr_grade >= 80 THEN
            enr_score := 'B';
        ELSIF v_enr_grade >= 70 THEN
            enr_score := 'C';
        ELSIF v_enr_grade >= 60 THEN
            enr_score := 'D';
        ELSE
            enr_score := 'F';
        END IF;
        RETURN enr_score;
    END test6;
END pack1;

 

select pack1.test6(85) from dual;

 

ONE-TIME ONLY 프로시저와 오버로딩

  • ONE-TIME ONLY 프로시저
    • 전역변수의 초기화나 기본적으로 처리하여야 할 로직
    • 패키지가 실행될 때 무조건 한번만 실행됨
    • 패키지 몸체부 가장 마지막 부분에 BEGIN절과 함께 정의됨
  • 오버로딩
    • 같은 이름의 여러개 프로시저 사용
    • 매개변수의 수가 다르거나, 순서를 달리하여 사용

 

<명세부>

 

  • CREATE OR REPLACE package C202144098.PACK2 is
    g_stu_dept varchar2(20);
    procedure test12 
    (v_stu_no in student.stu_no%type);
    procedure test12     -오버로딩-
    (v_stu_name student.stu_name%type);
    End;

 

<몸체부>

 

  • CREATE OR REPLACE PACKAGE BODY C202144098.PACK2 IS
        PROCEDURE test12 (v_stu_no IN student.stu_no%TYPE) IS
            v_stu_name student.stu_name%TYPE;
        BEGIN
            SELECT stu_name
            INTO v_stu_name
            FROM student
            WHERE stu_no = v_stu_no AND stu_dept = g_stu_dept;
            DBMS_OUTPUT.PUT_LINE(v_stu_name);
        EXCEPTION
            WHEN no_data_found THEN
                DBMS_OUTPUT.PUT_LINE('컴퓨터정보과에 학생이 없습니다.');
        END test12;

        PROCEDURE test12 (v_stu_name IN student.stu_name%TYPE) IS
            v_stu_no student.stu_no%TYPE;
        BEGIN
            SELECT stu_no
            INTO v_stu_no
            FROM student
            WHERE stu_name = v_stu_name AND stu_dept = g_stu_dept;
            DBMS_OUTPUT.PUT_LINE(v_stu_no);
        EXCEPTION
            WHEN no_data_found THEN
                DBMS_OUTPUT.PUT_LINE('컴퓨터정보과에 학생이 없습니다.');
        END test12;

    BEGIN
        g_stu_dept := '컴퓨터정보';
    END;             -ONE-TIME ONLY 프로시저

 

 

Execute pack2.test12(20191001);

 

Execute pack2.test12('김종헌');

 

 


트리거

어떤 조건에 맞는 이벤트가 일어나면 후속 이벤트를 발생시킴

 

트리거의 5 요소

  • 트리거 유형 : DML 단위의 트리거, 변경된 레코드 단위의 트리거
  • 트리거 동작 시점 : 트리거 동작 시점은 Before, After
  • 트리거 이벤트 : 트리거를 발생시킬 것 인지를 셜정
  • 트리거 조건 : 레코드 단위의 트리거에서만 설정할 수 있는 UPDATE 작업 시 특정 조건을 명시하여 조건에 맞는 레코드의 변셩에서만 트리거 이벤트를 발생
  • 트리거 몸체 : BEGIN ~ END절로 동작 정의

트리거의 형식

CREATE [OR REPLACE] TRIGGER 트리거 명

BEFORE | AFTER 이벤트 ON 테이블 명

[FOR EACH ROW]

[WHEN CONDITION]

BEGIN

...................

END;

 

트리거의 활성화 / 비활성화 / 삭제

ALTER TRIGGER 트리거 명 DISABLE / ENABLE

ALTER TABLE 테이블 명 DISABLE | ENABLE ALL TRIGGER

DROP TRIGGER 트리거 

'SQL' 카테고리의 다른 글

프로시저 / 함수 / 커서 - 페치 / 예외처리  (0) 2024.11.25
PL/SQL  (0) 2024.11.25
데이터 정의어 - DDL  (0) 2024.11.24
join  (0) 2024.10.08
2024-11-25 01:35:27

프로시저

처리 후 반환 값이 여러 개

 

프로시저 생성

Create [Or Replace] Procedure 프로시저 명

(매개변수 명 [모드] 자료형,

.........................................)

IS

  자체변수 명 - 자료형,

...................................

BEGIN

- 실행부

EXCEPTION

- 예외처리

END;

 

프로시저 삭제

Drop Procedure 프로시저 명

 

ex) 학년을 압력으로 학생의 이름을 검색

 

CREATE OR REPLACE PROCEDEURE p_1(

v_stu_no IN student.stu_no%TYPE,

v_stu_name OUT student.stu_name%TYPE)

IS

BEGIN

  Select stu_name

    into v_stu_name

    from student

    where stu_no=v_stu_no;

END p_1;

 

프로시저  실행

declare

variable d_stu_name varchar2(12);

begin

execute p_1(20213075, :d_stu_name); :d_stu_name = bind 변수

end;

print d_stu_name;

 


함수

처리 후 반환 값이 하나.

 

함수 생성

Create [Or Replace] Finction 함수 명

(매개변수 명 [모드] 자료형,

...........................................)

RETURN 자료형

is

  자체 변수 - 자료형

BEGIN

  - 실행부

  return 변수

EXCEPTION

  - 예외처리

END;

 

함수 삭제

Drop Function 함수 명

 

ex) 성적 환산 함수

CREATE OR REPLACE FUNCTION f_1(

v_enr_grade in number)

RETURN CHAR

IS

  enr_score char;

BEGIN

  IF v_enr_grade >= 90 THEN enr_score := 'A';

  ELSIF v_enr_grade >= 80 THEN enr_score := 'B';

  ELSIF v_enr_grade >= 70 THEN enr_score := 'C';

  ELSIF v_enr_grade >= 60 THEN enr_score := 'D';

  ELSE enr_score := 'F';

  END OF;

  RETURN (enr_socre);

END f_1;

 

execute :d_score := f_1(95);

 


커서, 페치

select 문의 실행 결과가 복수행을 가질 경우 사용함.

 

커서의 생성

CURSOR 커서 명

IS 

SELECT 질의

[FOR UPDATE];

 

페치

커서에서 행을 하나씩 가져올때 사용.

 

ex) 101번 과목을 수강하는 학생의 학번과 성적을 확인

 

CREATE OR REPLACE PROCEDURE p_2

IS 

  v_stu_no enrol.stu_no%TYPE;

  v_stu_no enrol.sub_no%TYPE;

  v_enr_grade enrol.enr_grade%TYPE;

  CURSOR t_cursor IS

    SELECT stu_no, sub_no, enr_grade

    FROM enrol

    WHERE sub_no = 101;

BEGIN

  OPEN t_cursor;

  LOOP

    FETCH t_cursor INTO v_stu_no, v_sub_no, v_enr_grade;

    EXIT WHEN t_cursor%NOTFOUND;

    dbms_output.put_line(v_stu_no||'='||v_sub_no||'='||v_enr_grade);

  END LOOP;

  CLOSE t_cursor;

END p_2;

 

프로시저 실행

execute p_2;

다른 프로시저를 실행하느라 과목번호가 501이 되어버렸다...

 

커서의 속성

  • %ROWCOUNT 속성
    • dbms_output.put_line('현재 '|| %ROWCOUNT ||'번째 행을 처리합니다.');
  • %FOUND 속성
    • if %FOUND then
      dbms_output.put_line('데이터를 읽었습니다.’);
      end if;
  • %NOTFOUND 속성
    • if %NOTFOUND then
      dbms_output.put_line('더 이상 읽을 데이터가 없습니다.’);
      end if;
  • %ISOPEN 속성
    • if %ISOPEN then
      fetch t_cursor into v_stu_no, v_sub_no, v_cour_grade;
      else
      open t_cursor;
      end if

예외처리

에러발생, 예외적인 상황 발생

처리 조건명 설 명
NO_DATA_FOUND 검색문 사용 후, 결과가 있는지 여부 판단
NOT_LOGGED_ON 데이터 베이스에 연결 상태를 판단
TOO_MANY_ROWS select 문에 into절을 사용한 경우 select 절의 결과가 복수 행일 경우
VALUE_ERROR 변수의 길이보다 큰 값을 저장하는 경우
ZERO_DEVIDE 열의 값을 0 값으로 나누는 경우
INVALID_CURSOR 커서 선언의 select 문에 대한 연산이 부적절한 겨웅
DUP_VAL_ON_INDEX UNIQUE INDEX가 설정된 열에 중복 값이 입력하는 경우

 

 

ex) 학번에 의한 학생 이름 검색

CREATE OR REPLACE PROCEDURE p_3

(v_stu_no IN student.stu_no%TYPE)

IS

  v_stu_name student,stu_name%TYPE;

BEGIN

  Select stu_name

    Into v_stu_name

    From student

    Where stu_no = v_stu_no;

dbms_output.put_line(v_stu_name);

EXCEPTION

  When NO_DATA_FOUND Then

    dbms_output.put_line('해당 데이터가 없습니다.');

END p_3;

 

 

프로시저 실행

execute p_3(20213088);

execute p_3(20213089);

 

 

변수를 통한 예외처리

........

IS

  예외조건명 EXCEPTION;

.....

  IF 조건 then

    RAISE 예외조건명;

.....

  EXCEPTION

    When 예외조건명 Then

.....

END;

'SQL' 카테고리의 다른 글

패키지 / 트리거  (1) 2024.11.25
PL/SQL  (0) 2024.11.25
데이터 정의어 - DDL  (0) 2024.11.24
join  (0) 2024.10.08
2024-11-25 00:39:46

PL/SQL의 구성

  • PL/SQL은 SQL에 절차적 언어의 요소를 더한 기능
  • 절차적 언어 요소
    • 선택처리(IF)
    • 반복처리(LOOP, WHILE, FOR)
  • 향상된 데이터 처리 능력을 부여함
DECLARE 선언부
모든 변수, 상수, 커서 등을 선언하는 부분.
BEGIN 실행부
SQL에서 선택처리, 반복처리 등을 포함한 실제 로직이 표현되는 부분.
EXCEPTION 예외 처리부
실행부 로직 처리 중 에러 또는 비정상적인 상황을 처리하기 위한 작업을 기술하는 부분.

 

PL/SQL의 종류

  • PROCEDURE : 프로시저 처리 후 반환. 값의 제한이 없음
  • FUNCTION : 함수 처리 후 반환. 하나의 값 반환
  • PACKAGE : 프로시저나 함수의 그룹
  • TRIGGER : 조건에 맞는 이벤트가 일어나면 후속 이벤트가 발생

변수

변수명 [모드] 데이터 타입
  • 매개변수, 자체변수
  • IS 로 구분됨
  • IS 다음의 자체 변수는 mode 생략
  • 매개변수는 역할에 따라
    • IN : 프로시저가 호출될 때 전달되는 값을 처리하기 위한 변수
    • OUT :  프로시저가 처리된 후 반환되는 값을 처리하기 위한 변수
    • INOUT :  두가지 기능을 갖는 변수

변수 타입

  • 스칼라(scalar) 타입
    • NUMBER, CHAR, VARCHAR2, DATE, BOOLEAN 등
  • 참조(reference) 타입
    • %TYPE
    • %ROWTYPE

선택처리문 (IF ~ ENDIF)

declare - 선언부
v_condition number := 2;
begin
IF v_condition < 1 then
dbms_output.put_line(‘대한’);
ELSIF v_condition = 1 then
dbms_output.put_line(‘민국’);
ELSE
dbms_output.put_line(‘만세’);
END IF;
end; 

 


반복 처리문 

Loop ~ END LOOP

declare

v_cnt number := 0;

v_sum number := 0;

 begin

  LOOP

   v_cnt := v_cnt + 1;

   v_sum := v_sum + v_cnt;

   dbms_output.put_line(v_cnt||" " ||v_sum);

   EXIT WHEN v_cnt = 10;

  END LOOP

end;

 

FOR ~ END LOOP

declare

v_cnt number := 0;

v_sum number := 0;

 begin

FOR v_cnt 1..10 LOOP

 v_sum := v_sum + v_cnt;

 dbms_output.put_line(v_cnt||" " ||v_sum);

END LOOP;

end;

 

WHILE ~ END LOOP

declare

v_cnt number := 0;

v_sum number := 0;

 begin

 WHILE v_cnt <= 10 LOOP

  v_cnt := v_cnt + 1;

  v_sum  := v_sum + v_cnt;

  dbms_output.put_line(v_cnt||" "||v_sum);

 END LOOP;

end;

'SQL' 카테고리의 다른 글

패키지 / 트리거  (1) 2024.11.25
프로시저 / 함수 / 커서 - 페치 / 예외처리  (0) 2024.11.25
데이터 정의어 - DDL  (0) 2024.11.24
join  (0) 2024.10.08