반응형
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\runas]
@="관리자 권한으로 CMD 실행"

[HKEY_CLASSES_ROOT\Directory\Background\shell\runas\command]
@="cmd.exe /s /k pushd \"%V\""

 

 

add_admin_cmd_context_menu.reg
0.00MB

반응형
반응형
@echo off
echo 윈도우 11의 마우스 오른쪽 클릭 메뉴를 윈도우 10 스타일로 변경하거나 원래대로 되돌립니다.
echo.
echo 1. 윈도우 10 스타일로 변경
echo 2. 원래대로 되돌리기
echo 3. 종료
echo.
set /p choice="선택하세요 (1/2/3): "

if "%choice%"=="1" (
    reg add "HKEY_CURRENT_USER\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
    echo 윈도우 10 스타일로 변경되었습니다.
) else if "%choice%"=="2" (
    reg delete "HKEY_CURRENT_USER\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
    echo 원래대로 되돌렸습니다.
) else if "%choice%"=="3" (
    echo 종료합니다.
    exit /b
) else (
    echo 잘못된 선택입니다. 프로그램을 종료합니다.
    exit /b
)

echo 변경 사항을 적용하기 위해 explorer.exe를 재시작합니다.
taskkill /f /im explorer.exe
start explorer.exe

echo 작업이 완료되었습니다.
pause

 

이 파일을 change_context_menu.bat와 같은 이름으로 저장한 후, 관리자 권한으로 실행하면 됩니다. 

반응형
반응형

2024.10.16. 17:50 조회자료

 

최근 한국과 북한의 상황은 여러 가지 사건과 긴장 고조로 복잡하게 얽혀 있습니다. 다음은 주요 사건들을 중심으로 정리한 내용입니다.

남북 긴장 고조
최근 북한은 남한 무인기가 평양 상공을 침범했다고 주장하며, 이에 대한 대응으로 경의선 및 동해선 남북 연결도로 일부 구간을 폭파했습니다. 이로 인해 한반도 긴장이 크게 고조되었습니다. 북한은 또한 군사분계선 일대에 포병여단을 배치하고 완전사격 준비태세를 갖추는 등 군사적 긴장을 높이고 있습니다.

한미일 외교 협력
이러한 상황 속에서 한국, 미국, 일본의 외교차관들이 서울에서 회동하여 북한 문제에 대한 공조 방안을 논의했습니다. 이 회의에서는 북핵 문제와 지역 및 글로벌 사안에 대한 협력 방안이 논의되었으며, 한미일 3국 협력 사무국 신설 등의 협력 강화 방안도 협의되었습니다.

북한의 군사적 위협
북한은 최근 남한을 향한 군사적 위협을 강화하고 있습니다. 김정은 북한 국무위원장은 남한을 주적으로 규정하고, 전쟁 기회가 오면 남한을 초토화하겠다고 경고했습니다. 북한은 또한 러시아와의 무기 거래를 통해 군사적 협력을 강화하고 있으며, 이는 우크라이나 전쟁에도 영향을 미치고 있습니다.

남북 관계의 변화
남북 관계는 2019년 하노이 북미정상회담 이후 냉각된 상태에서 시작되었습니다. 북한은 최근 남한을 별개의 국가로 규정하고, 통일 노선을 폐기하는 등 적대적인 태도를 보이고 있습니다. 이러한 변화는 북한의 내부 결속을 강화하려는 시도로 해석되고 있습니다.

국제적 반응과 전망
국제 사회는 한반도의 긴장 상황을 주시하고 있으며, 미국 대선을 앞두고 북한의 고강도 도발 가능성에 대한 우려가 커지고 있습니다. 전문가들은 북한의 위협이 과거와 달리 핵 위협을 포함하고 있어 더욱 심각하다고 평가하고 있습니다. 그러나 전면전 가능성은 낮다고 보는 시각도 존재합니다2.

이와 같이 최근 한국과 북한의 상황은 복잡하고 다층적인 요소들이 얽혀 있으며, 앞으로의 전개를 주의 깊게 지켜봐야 할 필요가 있습니다.

 

yna.co.kr

bbc.com

namu.wiki

반응형
반응형

imageReDirectory.py
0.01MB

 

 

하위 폴더까지 조회해서 이동하는 거랑 실제 위치에서 실행 안되는 경우 파일을 찾을 수 없는 등의 오류가 있어 조금 변경해 보았다.

생각보다 속도도 빠른 편인듯.

 

참고로 pillow 패키지를 사용하는데 설치된 파이썬에 해당 패키지를 설치해야 하므로 아래와 같이 설치하고 진행한다.

python3 -m pip install pillow

 

 

Python 사진 자동 정리 프로그램 개발  - 참고 링크: https://hellojason.tistory.com/27

 

[Python] 사진 자동 정리 프로그램 개발 (EXIF)

핸드폰/디카로 사진 촬영하는 일은 이제 일상이 되었습니다. Google Photo 를 사용하면 간편하지만, 비용도 문제고 과거 파일도 업로드해야하고, 용량이 크면 비용도 문제가 됩니다. 저도 NAS에 아이

hellojason.tistory.com

 

개선 내용

 

1. 하위 폴더 조회해서 이동할 건지 설정 : subfolder = False > True

2. 중복된 파일의 접두사 : duplicatePrefix = 'dup_'

3. 실행 위치에 따른 선택:

    cur_dir = os.getcwd()  # python 을 실행한 위치

    cur_dir = ‘’ # 다른 곳에서 실행하지만 사진을 조회하고 실행하려는 위치

 

import os
import shutil

from PIL import Image
from PIL.ExifTags import TAGS
from datetime import datetime

# 디버그 모드 활성화 여부 - True, False
DEBUG = True

# 하위 폴더까지 확인하기
subfolder = False

# 이동하려는 곳의 파일이 존재한다면 추가하려는 앞자리
duplicatePrefix = 'dup_'

# 이미지 확장자
img_ext = ['.jpg', '.jpeg', '.JPG', '.JPEG', '.png', '.PNG', '.bmp', '.BMP']
# 영상 확장자
mov_ext = ['.mp4', '.MP4', '.avi', '.AVI', 'mts', '.MTS', '.m2ts', '.M2TS']

# 이미지 파일 저장 리스트
img_list = []
# 영상 파일 저장 리스트
mov_list = []
# 기타 파일 저장 리스트
etc_list = []

# 실행 현재 위치 - 하위 폴더 조회해서 모두 이동시켜 버림
# cur_dir = os.getcwd();

# 실행 위치(파일 검색하는 위치) 고정
cur_dir = '/Users/jymun/Desktop/Photo/PY_TestImage/'

# 디버그 모드 시작하기
if DEBUG :
    print('img_list length : ', len(img_list))
    print(f'current_dir : {cur_dir}')

# 이미지 날짜 정보 조회하기 - 함수
def getImageDate(image, DEBUG=False):
    '''
    이미지 EXIF 정보 읽기 - 이미지 생성 년, 월 리턴
    '''
    img = Image.open(image)
    img_date = []

    if DEBUG : print(img.filename)
    
    # EXIF 정보로 이미지 촬영일 체크
    img_info = img._getexif()
    if img_info is not None:
        for tag_id in img_info:
            tag = TAGS.get(tag_id, tag_id)
            data = img_info.get(tag_id)

            if tag == 'DateTime' or tag == 'DateTimeOriginal':      # 촬영일 존재하면 년,월 세팅
                data = data.replace('-',':')                        # '-' 일자 구분자를 :로 변환

                # meta정보 고려해서 10자리 끊고 -> 빈칸 0 trim후 0 채워넣기
                data = data[:11]                                    # yyyy:mm:dd 10자리만 읽기
                data = data.replace(' ','0')                        # 공백 '0' 채움
                date = data.split(':')                              # date = [년, 월, 일]
                if DEBUG: print(f'Data : {data}, Date : {date}')
                try:
                    img_date.append(date[0])
                    img_date.append(date[1])
                except:
                    print('!!!!!! ERRROR !!!!!!!!!')
                    print(f'img name : ', image)
                    print(f'data : {data}')
                    print(f'date : {date}')
                    img_date[0] = 'error'           # 강제 error 세팅
                    img_date.append('00')           # 두번째 값 '00' 추가
                    print(f'img_date : {img_date}')

            if DEBUG:
                print(f'>>>>> {tag:25}: {data}')
            
    # EXIF 값이 없으면, 파일 생성일 세팅
    if len(img_date) == 0 :
        date = datetime.fromtimestamp(os.path.getctime(image)).strftime('%Y:%m:%d').split(':')
        img_date.append(date[0])
        img_date.append(date[1])
            
    if(DEBUG):
        print(f'date : {date}')
        print(f'img_date : {img_date}')
                
    return img_date

# 이미지 파일 이동 관련
def moveImageFiles(img_list, DEBUG=False):
    count = 0
    img_cnt = len(img_list)
    print(f'Target file count : {img_cnt}')
    for img in img_list:
        img_date = getImageDate(img, DEBUG)
        if DEBUG : print(img_date[0], img_date[1], img)

        # 파일 위치 구분함
        imgPath = img.split('/')
        # 마지막 파일명을 반환
        imgName = imgPath.pop();
        # 파일명 앞 위치를 저장
        imgOrgPath = ('/').join(imgPath);

        if DEBUG : print(f'name= {imgName}, {imgOrgPath}')

        # 새로운 폴더 위치 - 년도 / 월
        dir_path = os.path.join(img_date[0], img_date[1])
        # 원래 파일 위치
        s_path = os.path.join(img)
        # 이동하려는 폴더 위치 - 시작 위치를 기본으로 함
        t_imgPath = os.path.join(cur_dir, dir_path);
        # 이동하려는 폴더와 파일 위치
        t_path = os.path.join(t_imgPath, imgName)

        if DEBUG:
            print(f'dir_path : {dir_path}')
            print(f'Source_path : {s_path}')
            print(f'Target_path : {t_path}')

        # 년도/월 폴더가 있는지 확인 - 없으면 생성
        if not os.path.exists(t_imgPath):
            os.makedirs(t_imgPath)

        # 년도/월 폴더와 파일이 재하는 경우 - (prefix : dup_ 추가)
        if os.path.isfile(t_path) :
            dup_name = duplicatePrefix + imgName
            t_path = os.path.join(t_imgPath, dup_name)

        # 파일 이동
        shutil.move(s_path, t_path)

        print(f'{img} ====> {t_path}')
        count = count+1

    print(f'{count} files moved!')

# 현재 폴더(하위까지 조회하기)
if subfolder:
    for (root, directories, files) in os.walk(cur_dir):
        for file in files:
            file_path = os.path.join(root, file)
            print(f' > file(s) Name: {file_path}')
            
            if os.path.isfile(file_path):
                name,ext = os.path.splitext(file)
                if ext in img_ext:
                    img_list.append(file_path)
                elif ext in mov_ext:
                    mov_list.append(file_path)
                else:
                    etc_list.append(file_path)
            else:
                print(f'[{file_path}] is not File')
else:
    # 현재 폴더만 조회하기
    for file in os.listdir(cur_dir):
        file_path = os.path.join(cur_dir, file)
        if os.path.isfile(file_path):
            name,ext = os.path.splitext(file)
            if ext in img_ext:
                img_list.append(file_path)
            elif ext in mov_ext:
                mov_list.append(file_path)
            else:
                etc_list.append(file_path)
        else:
            print(f'[{file_path}] is not File')

# 결과 조회       
print('====== 최종 결과 ======');
print(f'Working Directory : {cur_dir}');
print(f'{len(img_list)} file(s) detected.')

# 최종 결과 확인
'''
if DEBUG:
    print(f'img_list: {img_list}')
    print(f'mov_list: {mov_list}')
    print(f'etc_list: {etc_list}')
'''
# 실행
moveImageFiles(img_list, DEBUG)

 

반응형
반응형

 

VSCODE 명령 팔레트 열기 : Command + Shift + P

 

1. Python: 인터프리터 선택

 

2. 프로젝트 폴더 선택

 

3. 인터프리터 경로 설정: 최근에 설치한 폴더가 맞는지 확인 아니라면 경로 입력으로 진행

 

반응형
반응형

Mac(Sonoma 14.2.1 기준 작성, 2024.02.03.)에서 Python 업데이트 방법에 대해 기록해 본다.

 

먼저 설치된 버전을 확인하는 과정부터 설명하자면

# 버전확인
python3 -V

# 버전확인2
python -V

# 설치된 위치 확인
which python3
결과 > python3: aliased to /usr/local/bin/python3

 

기존에 어떤 걸로 설정되어 있는지 모르겠지만, 필자의 경우는 python3 -V로 했을 때 나왔다.

최신 버전을 다운로드 하고자 한다면 아래 파이썬 홈페이지를 통해서 다운로드 받아 진행한다.

 

1. 파이썬 홈페이지에서 다운로드 - https://www.python.org/

 

Welcome to Python.org

The official home of the Python Programming Language

www.python.org

 

 

2. 다운로드한 걸 설치( 2024.02.03. 기준 3.12.1 버전이 최신)한다.

  아래의 위치로 설치가 되는 것을 확인했다.

설치위치: /usr/local/bin/python3.12

 

3. alias를 변경

alias python=/usr/local/bin/python3.12
alias python3=/usr/local/bin/python3.12

# python, python3 로 호출할 수 있도록 설정

python -V
결과 > Python 3.12.1

python3 -V
결과 > Python 3.12.1

 

반응형
반응형

연산자

Dart는 C나 JAVA에서 사용하는 기본적인 연산자를 거의(?) 그대로 사용이 가능하다.

구분 연산자
할당 연산자 =, +=, -=, *=, /=, %=
??=   대상이 null인 경우만 우변의 값을 넣어줌
~/=, <<=, >>=, &=, |=, ^=    잘 안쓰는 거...
산술연산자 +, -, *, /, %, ++, --,
~/  나누기, 정수 결과 반환
관계연산자 ==, !=, >, <, >=, <=
논리연산자 ! true/false 를 반대로
||, &&
삼항 연산자 ?      condition ? expr1 : expr2.  , 조건이 참이면 1, 아니면 2
??     expr1 ?? expr2  , 1이 null 이 아니면 1값, null 이며 2값
타입 테스트 연산자 as    강제형변환
is     특정 타입인 경우 true
ls!    특정 타입이면 false

 


  

 

final, const, static

► final : 변수를 참조하는 값이 한번 설정되면 다른 값으로 변경될 수 없음.

► const : 상수

► static : 흠,.. 인스턴스를 만들지 않고 언제든 실행할 수 있는  키워드. 이게 붙지 않으면 클래스로 인스턴스를 만들어서 참조해야함.

 

 

 

 

 

반응형
반응형

Dart에서는 일반적인 반복, 제어문을 사용한다.

홈페이지서 설명하는 내용과 내가 이해하기 쉬운 코드로 다시 작성해보도록 하겠다.

 

  •  if and else
  • for loops
  • while and do-while loops
  • break and continue
  • switch and case
  • assert
  • (추가) try-catch and throw

 


 

if and else

Dart에서 지원되는 ifelse 샘플이다.

if (isRaining()) {
	you.bringRainCoat();
} else if (isSnowing()) {
	you.wearJacket();
} else {
	car.putTopDown();
}

▸ Javascript 와는 달리 boolean 값을 사용하며, 다른 값은 사용해서는 안됨.

 

 

for loops

반복문 샘플 - for

var callbacks = ['a', 'b', 'c', 'd', 'e'];
for (var i = 0; i < callbacks.length; i++) {
	print("for - ${callbacks[i]}");
}

반복문 샘플 - for + forEach()

var callbacks = ['a', 'b', 'c', 'd', 'e'];
callbacks.forEach((element) { print("forEach - $element"); });

반복문 샘플 - for-in

var callbacks = ['a', 'b', 'c', 'd', 'e'];
for( var x in callbacks){
	print("for-in - $x");
}

 

 

while and do-while loops

조건을 평가하고 루프를 진행 - while

while (!isDone()) {
	doSomething();
}

루프를 실행한 후 평가 - do-while

do {
	printLine();
} while (!atEndOfPage());

 

 

break and continue

while 문으로 반복 실행 중 특정 조건이 맞다면 while을 종료 - break

var i = 0;
while(true){
	if( i >= 3 ) break;
	i++;
	print("i - $i");
}

for 루프 반복문 종료 - continue

var callbacks = ['a', 'b', 'c', 'd', 'e'];
for (var i = 0; i < callbacks.length; i++) {
      if( i >= 3) continue;
      print("for - ${callbacks[i]}");
}

 

 

switch and case

Dart의 switch 문은 정수, 문자열 또는 컴파일러 시간 상수(?, compile-time constants)를 비교함. 비교된 개체는 모두 동일한 클래스의 인스턴스여야 하며, 클래스가 재정의 되어서는 안됨.

 ▸ 같은 타입으로 비교하는 소리 같은데...

 

 그리고 case 에서 break 를 사용하는 것을 원칙으로 한다. 

var command = 'OPEN';
switch (command) {
  case 'CLOSED':
    executeClosed();
    break;
  case 'PENDING':
    executePending();
    break;
  case 'APPROVED':
    executeApproved();
    break;
  case 'DENIED':
    executeDenied();
    break;
  case 'OPEN':
    executeOpen();
    break;
  default:
    executeUnknown();
}

다음 예제는 오류가 발생되는 예. case 안에 수행하는 내용이 존재하면 오류가 발생됨.

var command = 'OPEN';
switch (command) {
  case 'OPEN':
    executeOpen();
    // ERROR: Missing break

  case 'CLOSED':
    executeClosed();
    break;
}

하지만 비어 있는 경우는 사용할 수 있다.

var command = 'CLOSED';
switch (command) {
  case 'CLOSED': // Empty case falls through.
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

또는 continue 문을 사용하여 진행할 수 있음.

▸ 테스트 해보지 않았으나, executeClosed()를 실행한 후에 nowClosed가 명시된 case 'NOW_CLOSED'를 수행하는 것으로 보임. 

var command = 'CLOSED';
switch (command) {
  case 'CLOSED':
    executeClosed();
    continue nowClosed;
  // Continues executing at the nowClosed label.

  nowClosed:
  case 'NOW_CLOSED':
    // Runs for both CLOSED and NOW_CLOSED.
    executeNowClosed();
    break;
}

 

 

assert

 개발 환경에서 assert 문구를 사용함. assert( condition, optionalMessage); 

참/거짓 조건에서 거짓인 경우 해당 부분에서 중단됨.

var text;

assert(text != null);

 

true 인 경우 그대로 진행됨

var text;

assert(text == null);

 


  

 

 

try-catch and throw

예외처리에 관한 내용. 

throw 를 이용하여 예외상황을 만들 수 있음.

throw 'Out of llamas!';

 

try-catch 를 이용하여 예외가 발생된 코드를 처리하기 위해 사용. 이것도 다른 언어들과 거의 동일.

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e, s) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

catch 상황에서 매개 변수를 넣을 수 있는데 수에 따라 다음과 같이 처리 됨.

매개변수 0. 아무것도 없음

매개변수 1. Exception 상세 내용

매개변수 2. StackTrace 객체 

 

rethrow를 사용하면 exception 상황을 처리하고 중지되지 않고 진행되도록 한다.

void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // Runtime error
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // Allow callers to see the exception.
  }
}

void main() {
  try {
    misbehave();
  } catch (e) {
    print('main() finished handling ${e.runtimeType}.');
  }
}

 

rethrow를 넣고 실행하면 main()의 catch까지 실행되며

아래와 같이 rethrow 를 주석처리 해서 실행하면

void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // Runtime error
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    //rethrow; // Allow callers to see the exception.
  }
}

void main() {
  try {
    misbehave();
  } catch (e) {
    print('main() finished handling ${e.runtimeType}.');
  }
}

 

misbehave()에서 catch가 처리되고 종료된다.

 

마지막으로 finally 처리

try {
  breedMoreLlamas();
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

exception 발생 여부 관계없이 일부 코드를 실행시키려고 한다면 finally를 사용한다.

exception이 발생되면 발생 후에 실행되며, 발생되지 않으면 try문 코드를 실행하고 실행된다.

 

 

 

반응형
반응형

기본 내용은 Dart 사이트에서 나와 있는 대로 진행했다.

책으로 나와 있으면 좋겠지만... 아직 한글로 된 책이 없는 것 같으니...(찾아보지도 않았지만...)

 

작성한 자료의 출처: https://dart.dev/samples

 

Language samples

Examples of idiomatic Dart with links to larger examples.

dart.dev

 

기본 Dart Program
// 함수 선언
printInteger(int aNumber){
	print('숫자: $aNumber'); // 콘솔에 출력
}

// 앱은 여기서부터 실행됨
main(){
	var number = 42;	// 변수를 선언하고 초기화
    printInteger(number);	// 함수 호출
}

// 함수 선언

한 줄로 된 코멘트(주석). 다중일 경우 /* */을 사용한다.

 

int

변수 유형

 

42

숫자. 

 

print()

콘솔에 출력

 

'...' or "..." 

문자열 리터럴. 

2020. 05. 20. 추가 - 홑따옴표 사용 권장. '...'

 

$aNumber  또는 $variableName 또는 ${expression}

문자열 리터럴 내부에서 변수 또는 표현식을 표현해준다.

 

main()

앱이 실행이 되는 필수, 최상위 기능

 

var

변수의 유형을 지정하지 않고 변수를 선언하는 방법

 

 


  

 

 

변수 - Variables

 Dart에서 사용되는 변수는 명시적일 필요가 없다.

var name = 'Bob';

var를 사용하는 것을 봤을 때 자바스크립트 같은데, 조금씩 섞여 있다 보니...

일단 위와 같이 입력한다면 '=' 기호 오른쪽을 보고 변수의 타입을 자동으로 지정해 준다.

위는 당연히 String 으로 인식된다.

 

하지만,

가장 중요하게 기억해야 할 부분은 Javascript에서는 한번 할당한 변수 타입을 재할당하여 변경할 수 있었지만, Dart 에서는 재할당이 불가능하다. var로 선언하면서 설정된 변수 타입은 변경할 수 없다.

//import 'package:part2_langsample/part2_langsample.dart' as part2_langsample;

void main(List<String> arguments) {
  //print('Hello world: ${part2_langsample.calculate()}!');
  var name = 'Bob'; // 자동으로 변수 타입 인식
  print('나의 이름은: $name');

  //name = 30; // 재할당 테스트
  print('나의 이름은: $name');

  dynamic name2 = 'dynamic Bob';  //재할당이 가능한 dynamic
  print('나의 이름은: $name2');

  name2 = 30;
  print('나의 이름은: $name2');

  Object name3 = 'Object Bob';  //재할당이 가능한 Object
  print('나의 이름은: $name3');

  name3 = 30;
  print('나의 이름은: $name3');

}

위의 코드를 보면 name을 string으로 할당한 후 30으로 number형으로 변경하면 에러가 발생된다.

 

재할당을 위한 방법으로는 var가 아닌 dynamic 또는 Object로 할당하면 가능하다.

 

 

명시적으로 변수를 선언하는 것도 가능하다.

String name = 'Bob';

홈페이지에서 설명된 Dart의 타입을 설명하면 다음과 같다.(Runes, Symbols 는 제외)

1. Numbers ( int, double, num)

2. Strings ( String )

3. Booleans ( bool )

4. Lists ( List )

5. Sets ( Set )

6. Maps ( Map )

 

 

 

반응형
반응형

Dart 프로젝트는 VSCode( Visual Studio Code)에서 만들 수 있다.

(DartSDK설치하고 터미널에서 만들 필요 없이!)

 

사전에 바로 전 작성한 포스팅 대로 진행바란다.

 

2020/05/18 - [난장 Dev/Flutter - Dart] - Dart - 시작하기 - VSCode 설치

 

Dart - 시작하기 - VSCode 설치

먼저, Flutter를 시작하기 위해서 Dart라는 언어에 대해 공부가 필요하다. 나처럼 그냥 바로 Flutter를 시작할 수 있지만 얼마 후 나처럼 Dart를 시작할 것이다. 어렵지는 않지만 최소한 변수, 조건문, �

naan.co.kr

 

 

VSCode를 실행하고 나서 상단에 보이는 "View > Command Palette..." 을 클릭하거나 "Shift + Command + P" 키를 눌러 Command Palette를 실행시킨다.

 

아래의 화면이 뜨면, ">dart"를 입력하고 나오는 "Dart: New Project"를 클릭한다.

 

다음 단계로 Dart 템플릿을 설정해야 하는데 공부를 위한 것이니 "Console Application"을 클릭한다.

 

사용할 프로젝트 이름을 입력한다. 모두 소문자로 입력해야 한다. 

예) part1_helloworld

 

 

프로젝트를 저장할 위치를 지정한다.

 

 


  

 

 

그러면 Dart 기본 프로젝트가 만들어 진다.

 

 

F5키를 누르면 아래 Console에서 결과 값을 확인 할 수 있다.

 

다시 코드로 가고 싶다면 왼쪽에 보이는 아이콘 중 제일 위에 있는 아이콘을 클릭하면 다시 입력된 코드를 확인할 수 있다.

 

Android Studio 에서는 기본 프로젝트 생성이 VSCode처럼 하지 않고 터미널에 들어가서 직업 생성하고 열어야 하는 것 같았다.

 

반응형

+ Recent posts