본격 장마가 시작이라는데, 23일은 잠깐 내리다 그치고 24일은 오는둥 마는둥 가뭄이 심각하다는데, 비가 많이 내렸으면 좋겠다. 다치는 사람 없이,

한국주식은 이제 저점이라는 사람이 많다는거보니 더 내려갈것 같다. 잠깐 반등할것도 같아보이지만, 유통원자재대란 + 고유가(약간 내렸지만 아직 멀었다) 에 인플레대응하는 금리인상까지 악재투성이이다.

 

한국주식은 코스피 52포인트상승 코스닥 35포인트 상승

LG디스플레이 - 다음분기 매출이 오를것 같은데 지금 재무재표는 좋지않다. 15200

-> 3프로에서 기술과 생산설비에 지속투자 비용이 높아서 장기로 들고 있기는 적합치 않다고 했는데, OLED 관련한 계약은 공시에서 몇개좀 나왔는데 더 분발 해줬으면...

미국주식장은 다소 반등 

리얼티인컴을 계속 매수하려하니, 몇일사이에 올라버려 매수할수가 없다. 68.66

어펌도 16불을 찍을때 물타려하니 다시 조금 올라왔다 22.85

ASML은 EUV 매출은 몇년간 지속될것이기 때문에(공장에 불났다는 기사를 봤었지만) 꾸준매수할 계획이다. 512.3

루시드는 당분간 관망이다. 물은 언젠가는 타야하지만, 재무재표나 매출에 관한 시그널이 좋아져서 회복세에 돌입하면 사도 늦지 않을것 같다. 19.05

엔비디아는 월급타면 한두개씩 주워도 될것같다. 4천번대 시리즈와 인공지능에서 이용하는 GPU를 이용한 학습모델 개발은 앞으로 계속 많아질것이기 때문이다. 168.65

테슬라는 반등하는 모양세지만, 사이버트럭이나 다음세대 인공지능(자율주행)이 나오지 않는이상 사고율을 확 줄이기는 힘들것 같아서 역시 관망이다. 734.0

벨로다인은 반등하는 모양세고, 돈이 생길때마다 조금씩 사고 있는데, 23일과 24일 GM자동차 자율주행관련한 스파이샷에서 벨로다인 라이다를 장착하고 있는모습을 봐서, 거의 모든 자동차 회사들이 필수가 아닌가 싶다(개인적 생각) 역시 돈생길때마다 적금처럼 사고있다. 1.275

 

내 우선순위 리스트

리얼티인컴 -> 장세가 불안할땐 배당이 최고

ASML -> 반도체 사이클에 가장 중요한 반도체장비 제조 공급사 (EUV유일무이)

엔비디아 -> 인공지능 관련한 장비관련 1위라고 봐도 무방

벨로다인 -> 먼미래지만 쌀때사야한다는 생각에, 역시 미래는 센서다. (인공지능이든 로봇이든 자율주행이든)

어펌 -> 미국이 우리나라처럼 신용기반의 거래가 점점 늘어날 것으로 예상되기 때문에 역시 쌀때 산다. (지금 재무상태는 좋지 않다)

애플 -> 갓플.. 말이 필요한가 오늘이 최저가다!!! 

 

 

 

이전 블로깅에서 클래스파일을 추가하고, 솔루션내의 파일들을 정리 하였는데, 이번에는 파일입출력을 간단히 다뤄보겠다.

처음했던 기능적기와(기능명세) 마찬가지로 구현할 기능을 세세하게 말로 풀어서 써보겠다. 이 기능에 대한 설명이 명확하지 않으면, 프로그램을 작성하는데에 있어 수정을 많이 하거나 생각지 못한 부분에서 버그가 생길 수 있으며, 정해지지 않은 기능을 프로그램 작성중에 발견하여 대대적인 수정이 필요한 경우가 생긴다. 

 

파일입출력하기

- 파일을 읽기기능 - 지정된 경로를 읽을 것인가? 경로를 입력받아 읽을것인가를 정해야한다.

- 파일을 쓰기기능 - 지정된 경로에 파일을 쓸것인가? 파일이 없다면 새로 생성할 것인가? 어떤 형태로 파일을 쓸것인가? 

위와같이, 파일 입출력시 예상되는 오류부분을 적는데 로또번호를 텍스트로 읽고, ( 기존번호 ) 텍스트파일 형태로 출력할 것이기 때문에 기능을 적는것이 필요하다. 여기에서는 정해진 경로에 지정하도록 해보겠다.

 

지난번 클래스파일 추가하기를 이용하여 FileController.cs 라는 class 를 추가해주자.

파일을 추가했다면, 위에서 적었던 기능명세를 주석을 이용하여 클래스내에 적어주자. 이 기능명세는 곧 함수가 된다고 생각하면 된다.

짧은 팁으로, 영역 전체를 주석처리 하는 기능은  Ctrl + K + C 이다. 해제기능은 Ctrl + K + U 다 프로그래밍을 하다보면 굉장히 자주 사용하게 되므로, 10번 정도 주석하고 풀기를 해서 자연스럽게 사용할 수 있도록 숙달해두자.

기능명세를 주석처리해둔 모습  기능은 곧 함수가 된다. (단축키는 Ctrl+k+c)

 

위처럼 기능명세를 주석으로 추가 했다면, 기능에 맞는 이름을 함수로 만들어보자.

파일읽기는 ReadFile()  파일쓰기는 WriteFile()

보면서 느꼈겠지만, 암묵적으로 클래스의 첫자와 함수의 첫자는 대문자로 쓰는것이 관습이다. 대다수의 변수는 소문자로 시작을 한다. 

기능명세 밑에 함수를 작성하였다.

함수를 추가했으면 함수에 어떤기능이 있는지 세부적으로 보자. 여기서는 정해진 경로를 읽을 것이기 때문에 

readPath, writePath 라는 이름의  string 타입의 변수를 클래스 아래에 두개 만들어두자.

 

여기까지 했으면, 솔루션 탐색기에서 프로젝트 우클릭을 통해 프로젝트 폴더로 가보자.

여기서 파일탐색기에서 폴더열기를 누르면, 프로젝트의 폴더가 열리게 된다.

 

폴더가 열리면 datas 라는 폴더를 만들어보자. 우클릭을 해서 새폴더를 만들고 이름을 datas로 바꾸어도 되지만, 

컴퓨터를 잘 아는척을 위해 새폴더만들기 단축키인 Ctrl + Shift + N 을 눌러 새폴더를 만들고, F2를 누르면 이름을 변경할수 있게 되는데 datas로 이름을 바꿔주자.

 

이제 폴더를 만들었으면, 코드 작성하던 곳으로 돌아가서 readPath 와 writePath 의 경로에 다음과 같이 변경해주자.

 

문자열을 처리할때 경로의 역슬래쉬를 쓸경우는 문자열 앞에 골뱅이 또는 at (엣) sign 이라고 하는 특수문자를 추가해준다.

경로를 다 적었으면, 보통의 프로그램이라면 관행적으로 가지고 있는 InitPath 라는 함수와 workingDirectory 라는 string 타입의 문자열 변수를 만들어준다. ( 참고로, 클래스내의 함수 밖 변수의 정식 명칭은 멤버변수라고 한다. 함수내의 변수는 로컬변수 라고 한다.) 

 

로컬변수와 멤버변수 예시

위처럼 함수와 멤버변수를 작성했으면, 프로젝트내의 경로에 접근해보자.

그전에 라이브러리 선언 부분을 System.IO 를 쓰고 나머지는 다 지우겠다. 그리고 InitPath 함수 내부에 다음처럼 작성해보자.

 

경로를 절대경로로(드라이브부터 프로젝트까지) 특정해버리면, 시스템이 달라질때마다, 프로그램을 새로 컴파일 ( 사람이 작성한 부분을 컴퓨터가 읽을 수 있도록 바꿔주는 기능 ) 해야 하므로 컴퓨터가 달라지더라도 이 프로그램이 실행되도록 상대경로로 지정할 필요가 있다. ( 잘 모르면 구글에서 검색해보자 )

 

왼쪽은 mylist.txt 라는 파일이 경로에 있으면 존재라는 글자와 경로가 출력되게 해두었고, 없으면 없음 이라고 출력되게 하였다.

우측은 FileControll 클래스의 인스턴스 ( 객체라고도 한다) 를 만들고 InitPath 함수를 호출시켜주었다. 위의 로또출력부분은 원활한 테스트를 위해 잠시 주석처리를 해두자. ( 주석은 영역설정하고 Ctrl + K + C )  추가로 콘솔창이 바로 꺼지는것을 방지하기 위해 아래 한줄도 추가해주자. 

 

아직 없어서 없음이 떴다.  그렇다면 콘솔창을 종료하고, 없으면 파일을 만들어 주도록 해보자.

먼저 MakeFile 이라는 함수를 추가하고 파라미터는 string path 로 추가해주자.

 

위처럼 파라미터가 있는 함수를 만들고, 파일을 만드는 부분을 추가해보자.

 

파일이 없으면 만들도록 하고 저장한후 실행 (F5) 해보자.

실행하면 에러가 없다면 아무것도 뜨지 않는 콘솔창이 뜰텐데 끄고, 솔루션탐색기에서 솔루션 폴더로 가보자.

 

아무내용이 없는 파일이 생긴것을 확인할 수 있다. 위에서 폴더를 직접 만들었는데,  이를 응용하면 폴더도 생성할 수 있다.

이제 내가 만든 로또번호를 파일에 저장을 해보자.  그전에 읽거나 저장하는 경로가 두개이기 때문에 ( 지금은 같지만 이후에바뀐다.) 경로를 가져오는 간단한 부분을 작성해보자.

 

위의것은 나열자라고 하며, 그냥 나열하는 기능이 있는데 데이터타입을 특정하거나, 값을 부여할 수 있다. 자세한것은 

C# 나열자 라고 구글에서 검색하면 된다. 아래의 GetFullPath 는 나열자를 파라미터로 사용하여 경로를 가져온다.

이 함수를 읽어보면, 파라미터가 READ 면 workingDirectory + readPath 를 가져오고 READ가 아니면  orkingDirectory + writePath 를 가져온다는 의미이다. 

 

이제 출력할 필요가 없으므로 위에서 만든 함수를 이용하여, InitPath 함수를 정리해보았다.

여기서 var path 에서 var는 최신언어들에서 제공되는 특성인데,  타입을 특정하지 않고 컴파일타임에 결정된다. ( 이를 암시적 형식 지역변수 라고한다)

즉 위의 코드에서 path 는 GetFullPath 의 return 타입이 string 이므로 암시적으로 string이 된다.

 

읽고 쓰고 경로를 조금 바꿔주자. 

그리고 만들어진 로또번호를 FileController 객체에 전달하기 위해 Numbers 클래스를 조금 변경해주겠다.

 

List 를 멤버변수로 바꿔주고, 저장하기전 보기좋게 바꿔주기위해 GetStringFormatValue 라는 함수를 만들고 작성해준다.

내용은 다음처럼 작성해준다. 이부분은 뽑아진 번호를 쉼표로 구분하게 한다.

 

위처럼 바꿔줬으면 FileController 로 돌아와서 WriteFile 의 파라미터를 다음과 같이 바꿔주고 내용을 작성해준다.

 

Number 클래스에서 만든 로또번호를 파라미터로 전달하고, 로또번호를 파일로 저장한다.

마지막으로 main 함수로 가서 다음처럼 바꿔준다. 

 

기본적인 파일 출력은 끝났다 저장하고 F5를 눌러 잘 실행되는지 확인해보자.

 

실행하면 파일이 만들어 지느라 한번 오류가 날수 있는데, 이부분은 다음에 다루기로 하고 다시 실행해주면 위와같이 이번주 로또번호가 파일에 잘 출력된것을 볼 수가 있다. 

여기까지 따라왔다면 프로젝트 폴더의 bin\Debug 폴더로 가면 아래처럼 파일들이 생성되어있는것을 볼 수가 있는데

축하한다. 여러분은 파일생성기능까지 있는 프로그램을 완성하였다.

다음에는 로또번호 여러개 생성하기 릴리즈모드로 exe 파일 뽑아보기 등을 블로그하겠다.

오늘작성한 프로그램은 이곳에서 다운받아서 exe 로 뽑아볼수 있다.

https://github.com/IlseonSEO/getlottonums/blob/main/lottoTest.zip

-파일 추가하고, 정리하기. ( 양이 많아서, 파일입출력은 다음에 다룰예정 )

파일입출력을 하기에 앞서 보기 좋은 상태로 만들기 위해

main 함수가 있는 실행파일과 그 외의 파일들로 클래스별 분리를 하겠다.

먼저 기본에 만들었던 Numbers라는 클래스파일부터 생성, 생성방법은 

우측 솔루션 탐색기의 의 '파일 - 새로만들기 - 파일' 을 선택하면 다음과 같은 창이 나온다. 

(솔루션 탐색기가 닫혀있거나 없다면 메뉴의 보기 항목을 누르면 솔루션 탐색기가 있다 )

위 스크린샷의 솔루션 이름 ( 여기서는 MakeLottoClass ) 에 우클릭을 하고 다음과 같이 클래스추가를 눌러준다. 

 

위처럼 클래스를 선택하면 아래와 같은 창이 뜬다.

 

이름을 Numbers.cs 라고 쓰고 추가를 누르자.

 

Visual Studio 와 같은 컴파일기능을 제공하는 대부분의 코드작성 에디터에서는 빨간 밑줄로 뭔가 잘못되었다는 표기를 해준다.

 추가를 하면 위처럼 빨간색 밑줄이 그어지게 되는데,  이곳에 마우스를 올려보면 Numbers 라는 이름의 클래스가 이미 있어서다. 

이제 program.cs 탭을 눌러서 원래 작성하던 곳으로 돌아가자. 코드를 두쪽으로 한번에 보고 싶다면, Alt + W V 키를 누르면 화면 분할이 되면서 다음과 같이 된다. 

위처럼 화면 분할이 되어서 코드를 모두 볼수 있게 되었다. 

이제 기존에 작성했던 class Numbers 의 모든 부분 ( 18줄 부터 블록 닫힘 기호까지 ) 을 복사해서 우측으로 옮겨주자. 

 

프로젝트가 커지거나 기능이 많아지면, 이처럼 분리와 관리의 필요성이 생긴다.

위처럼 파일분리를 한 후 마찬가지로 Ctrl + S 키를 눌러 저장을 하고 정상적으로 실행이 되는지 확인을 위해 F5 키를 눌러보자.  정상적으로 실행이 되었다면 마찬가지로 작성했던 결과물을 콘솔화면으로 볼 수 있을것이다.

 

 

+ Recent posts