2019. 1. 25. 15:11

procedure TForm1.Button1Click(Sender: TObject); 
begin 
… 
end; 

위의 Button1Click 메소드는 Sender라는 TObject 포인터를 매개변수로 받는다. 

델파이에서 모든 이벤트핸들러는 최소한 한 개의 Sender 매개변수를 가진다. 

버튼이 클릭될 때 OnClick에 대한 이벤트핸들러가 호출되는데 Sender라는 매개변수는 해당 이벤트핸들러를 호출하는데 사용된 버튼(여기서는 당연히 버튼)을 참조한다. Button1을 클릭하면 Button1Click이 호출되며 Button1이라는 객체의 포인터가 Sender라는 매개변수를 통해 전달받게 된다. 
그렇다면 왜 Sender라는 매개변수를 넘겨주는 것일까? 


Sender 매개변수의 역할은 해당 이벤트를 실행한 주체가 어떤 컴포넌트인지 알려준다. 

이를 통해 서로 다른 두 컴포넌트가 동일한 이벤트 핸들러를 사용하는 것이 가능해진다. 

예를 들어  button1과 button2이 동일한 기능을 수행하도록 할 때 이벤트 핸들러를 각각 작성하지 않고 한 개만 작성하여 두 컴포넌트가 이를 공유하도록 하면 된다. 


이벤트 핸들러를 공유하기 위해서 해주어야 할 작업은 다음과 같다. 


첫째,    컴포넌트에 대한 이벤트 핸들러를 작성한다. 
둘째,    컴포넌트를 작성한다. 
셋째,    Object Inspector에 event 페이지를 클릭한다. 
넷째,    컴포넌트의 액션에 해당하는 event에 기작성된 이벤트 핸들러 리스트를 연다. 
다섯째, 공유하고자 하는 첫번째 컴포넌트의 이벤트 핸들러를 선택한다. 


이제 한 이벤트 핸들러를 두 개(혹은 그 이상)의 컴포넌트가 공동으로 사용하는 것이 가능하다. 
그럼 다음 예제를 통해 어떤 컴포넌트가 이벤트 핸들러를 실행하고 있는지 Sender를 통해 확인해 보자. 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
if Sender = Button1 then 
  ShowMessage(‘Button1 clicked!’) 
else if Sender = MenuItem1 then 
  ShowMessage(‘Button2 clicked!’) 
else 
  ShowMessage(‘??? clicked’); 
end;          

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    Button1Click(Button2); 
end; 

procedure TForm1.Button2Click(Sender: TObject);의 결과는 어떻게 될까? 


그렇다 ‘??? clicked’이 될 것이다.

Posted by 토실토실천재
2019. 1. 25. 12:54

1. 컴파일러

 

프로그래밍 언어를 한답시고 컴파일러를 모른다는것은

영어알파벳 자체를 모르는 사람이 가이드없이 영어권 나라에 가는 경우입니다.

물론.....사람사는것은 워낙 변수가 많아서 바디 랭귀지가 가능하긋지만 그냥 받아들였으면 합니다.

 

a. 컴파일러란 대체 뭔가?

 1. 프로그래밍을 한다는것은 컴퓨터 cpu에게 명령을 하기위해서 인데,

    실제적으로 은밀하게 보자면 우리는 cpu에게 우리가 직접적으로

    명령문을 내리기 위해서가 아닙니다

    그럼 누구에게 알아듣는 코드를 작성한다는것일까요?

    컴파일러입니다. 컴파일러가 없는 프로그래밍 랭귀지는 거의 없을겁니다.

    물론....초저급언어(low level language)인 어셈블리어나 기계어는 작성해서

    바로 넣지만 말이죠. 코드가 16진수나, 0,1로만 이뤄져있지요

    가끔 컴파일에러가 나서 디버깅 창을 열면 볼수가 있습니다. 어셈블리코드;;

    마치....암호같습니다...

 

2. 이 컴파이일러는 워낙 똑똑해서 사람이 치는 코드도 인식하고 이것을 기계어로 바꿔줍니다.

   한국사람이 한국어로 통역관한테 말을 하면, 잘 번역해서 영어로 번역해서 말해줍니다.

 

     결론은 우리는 컴파일코드를 작성한다고 해도 과언이 아니죠

 

b. 닷넷에서의 컴파일러란?

   하지만 C#.NET은 좀다릅니다.

   바로 MicroSoft에서는 통합솔루션이라는 개념으로 닷넷 프레임워크에서 동작하는

   실행파일을 만들기 위한 닷넷언어들만의 컴파일러를 만들었지요

   그것이 CLR입니다. 즉, Common Language Runtime 인데,

   우리가 C#으로 작성한 코드를 IL(중간언어)로 바꿔줍니다.(CIL, MSIL 이라고도 합니다)

 

   그리고 이 IL언어로 실행파일로 저장을 하고

   우리는 닷넷프레임워크상에서 실행을 하는거죠

   여기서 끝이면 좋겠지만 이 IL자체로써 cpu에게 명령을 내릴순 없습니다.

   이 변환된 코드는 다시 JIT(Just In Time) 컴파일러로 변환을 하게 되어 직접적인 기계어로 만들어져

   cpu에게 인식됩니다. 물론 이것도 CLR로 컴파일이 되는거죠

 

  C#코드  -> (CLR컴파일)  -> IL 코드  -> JIT 컴파일(CLR)  ->  기계어(네이티브어)

 

우리가 C#프로그램을 만들려면 C#컴파일러를 사용해야하며,

상대방에 컴파일러 뭐 쓰냐란 질문이 나온다면,,,,

 1. C#컴파일러

 2. CLR컴파일러

 3.  비쥬얼 스튜디오 닷넷  버전

 이 3가지 말은 거의 같다고 생각해도 무방하겠네요

 

 

2. dll 파일 (Dynamic Link Library) : 동적링크라이브러리 파일

 

가끔씩 윈도우의 이상한 폴더(?)ㅋ 폴더를 이리저리 다니거나, 간단한 게임을 받으면

dll 파일이라고 있을겁니다. 이것이 없으면 실행파일이 실행이 되지가 않지요

물론 더블클릭해도 내용을 볼수가 없습니다.

즉...코드가 은닉되어 있기때문에, 어떻게 구현되있는지 알수가 없지요.

이것은 다른관점으로 볼때, 프로그래머의 능력을 은폐시킨것과 같습니다.

나아가 프로그래머의 재산을 보호한것이기도 합니다.

 윈도우 운영체제에만 있는것으로 기능적으로 본다면 참으로 괜찮은것 같습니다.

 

2-1. dll파일의 정의

  소프트웨어를 몇개의 파일로 나누어 따로 저장해서, 필요한것만 메모리에 로드시켜 사용합니다.

  이것은 기능이 특정기능이라면 다른 응용프로그램에서 사용이 가능합니다.

  다른 프로그램인데 똑같은 기능을 쓴다면, 또 다시 코드를 작성해야하는데, 이는 시간과,

  메모리 등을 절약이 가능하고,  경제적인 프로그램 작성이 가능하다는것입니다.

 

1. 프로그래머의 코드 은닉, 재산보호

2. 효율적인 프로그램

    - 코드의 재사용, 메모리/시간 절약

그렇기 때문에 dll파일이라는것을 만들어서 이런 이런 사정상 만드는것입니다.

 

자 그럼 다음에는 이 dll파일을 만들어서,

프로그램을 작성하기로 하겠습니다.


'프로그래밍 > C#' 카테고리의 다른 글

C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-3. 네임스페이스  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
C#-1. C#의 특징  (1) 2019.01.23
Posted by 토실토실천재
2019. 1. 25. 09:04
using System;

namespace A
{
    class B
    {
           static void Main()
           {
                   System.Console.WriteLine("hello, C# this is my First C# programing Code");
           }
    }
}
 
위의 코드를 본다면 어색한 분들도 계실것이고, 익숙하신분들도 계실것이고,
뭔 암호인지 하시는분들 제 각각 다른 생각이 드실겁니다.
위의 예제코드는 매우 간단하면서도 많은것을 담고 있기 때문에, 그냥 휭하니 넘기시면
차후에 C#의 기본에 ... 프로그래밍 자체의 기본기에 약점이 생길것입니다.
 
우선은 네임스페이스가 뭔지 한번 알아봐야 겠습니다.
(컴파일러에 대한 설명에 다음장에서 하겠습니다)
 
네임스페이스(namespace) 말그대로 이름공간입니다. 직역그대로이죠
학교 한 반에 김철수라는 학생이 2명이나 있다고 치면, 김철수는 2명이기때문에
출석을 부를때마다 항상 충돌과 학생들과 선생님들의 혼돈이 오기 마련입니다.
원초적으로 같은 이름을 가진 학생들은 차라리 다른반에 배치시켜서,
1반의 김철수 2반의 김철수라고 구분이 될것입니다. 물론....그런경우는 좀 냉혹하지요?
 
마찬가지로 프로그램상에서는 이런 현상, 변수, 메소드, 클래스 등을 구분해서 하나의
반에다가 넣어서 구분하는것입니다. 다른 용도의 변수, 메소드, 클래스라도 이름이
같으면 컴퓨터도 혼돈이 오기 마련입니다. 나아가 클래스를 기능별로 분류가 가능해지고
방대한 길이 코드에서 여러명의 개발자가 같은 프로젝트를 진행할때 우연찮게 같은 이름을 쓸수가 있습니다. 이렇게 혼돈도 방지하고, 클래스를 기능에 따라 분류하여 네임스페이스로 하나로
묶어두면 쳬게적으로 클래스를 좀더 효과적으로 쓸수있습니다.
 
예를 들어볼게요
 
class Chulsu { int a;}
class Chulsu { int b;}
두 클래스는 내용은 다르지만 이름이 똑같기 때문에 그냥 딱봐도 컴파일러(번역기)가 헷갈려합니다.
당연히 오류입니다. 철수가 2명일때 철수를 부르면 부른사람도 당황하고, 철수 2명도 누굴 부른거지
하고 짜증나겠지요?
자 이렇기 때문에 반을 나눠보죠
namespace A
{
    class Chulsu {int a;}
}
 
namespace B
{
    class Chulsu {int a;}
}
 
이렇게 하면 똑같은 클래스라고 할지라도 다른 이름공간(namespace)에 있기때문에
에러가 나지 않고, 구분이 가능합니다. A.Chulsu , B.Chulsu 이런식으로요
 
모든 명칭은 항상 특정한 네임스페이스 안에 정의 되어 있어야 하지만
위의 예제처럼 namespace 가 없으면 기본 네임스페이스로 인식되게 됩니다.
그리고 네임스페이스 안에 네임스페이스가 중복해서 정의 될수 있습니다.
 
namespace A
{
   namespace B
   {
        class C_Class
        {
            ............
         }
    }
}
이것은 또한 A.B.C_Class 라고 참조 할수 있습니다.
 
그리고 참조되는 네임스페이스 사용이 잦아지고, 네임스페이스길이가 길어지면 참으로
코딩하기가 귀찮아집니다.
그러므로 using을 쓸수가 있는데
using K = A.B;
라고 하면 K라는 별칭으로 이 네임스페이스에 속한 명칭을 바로 참조 가능합니다.
K.C_Class라고 하면 됩니다.


유용하게 봤다면 팁 감사합니다

'프로그래밍 > C#' 카테고리의 다른 글

C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
C#-1. C#의 특징  (1) 2019.01.23
Posted by 토실토실천재
2019. 1. 24. 08:59
우선은 C#을 하기 위해서는 닷넷 프레임워크가 깔려있다면
어디서 작성을 해도 좋으나
풍부한 편의성과 개발자 편의를 위해서 Visaul  Studio 2005 버전이상에서
작성하는것이 좋습니다. 물론 2008이 현재까지는 제일 좋습니다.
해당 글을 작성된 일자가 꾀 오래되었네요..양해바랍니다.

현재는 마이크로소프트사에 가면 Visual Studio Community 버전이 있으므로 
무료로 사용할 수 있습니다^^

그리고 시중의 C#책...본인도 그리 많이 본것은 아니지만, 대부분 C/C++과 비교설명한것이 
대부분이더군요. 순수하게 C#을 가지고만 접근한책이 많이 부족합니다. 그래서 처음 하신분들은
짜증이 날지도 모르지만, 어쩔수없습니다. 본인은 C/C++을 공부해본적이 있기때문에,
그리고 본인도 부족하지만 C를 가르친 경험도 있어서, C가 더 편합니다.
C#자체가 C/C++에 모태를 두고 있기 때문에 개발자들과 역자들은 어쩔수없이 비교설명하고, 대부분 C/C++을 했다고 가정을 하기  때문에 짜증이 나더라도 이해해야 할것 같네요. 좀더 고차원적으로
언급하자면, 프로그래밍 언어의 기능은 다 비슷비슷 하다는 생각도 하게 될것입니다.

1. C# 타입 시스템
  - 1. 자동메모리 관리 기능 
        (이에 따라 개발자는 메모리에 대한 접근과, 걱정을 하지 않으셔도 됩니다)
  - 2. 통합 시스템이다 보니 모든것이 객체로 존재 합니다. 어떤 데이타라도 객체로 취급합니다.
  - 3. 프로퍼티, 메서드, 이벤트는 기본으로 제공
  - 4. C#은 어튜리뷰트를 지원하고, 컴포넌트에 대한 정보를 정의 할수 있습니다.

좀 어려운 말을 적었네요. 사실 지금은 그러려니 하면서 넘어가셔도 크게 상관은 없습니다.
그렇다고 무시하고 넘어가란말은 아닙니다. 프로그램을 작성하실때는 메모리에 아주 민감해져야
합니다. 아키텍쳐(닷넷내부실행과정)의 중요성을 지나친다면.........
프로그래머가 아닌 그냥 따라치는 사람이 되어 버립니다.
여기서 미처 언급하지 못한 내용을 여러가지 책을 통해서 습득하셔야 합니다.

2. C#의 첫 발자국 "hello C#" 작성해보기
  - hello.cs
   1. 비쥬얼스튜디오 2008을 켠다. 좀 무거워서 로딩하는데 시간이 걸립니다.
       참고) 로딩 : 느린메모리에서 상대적으로 빠른메모리로 로드하는것을 로딩이라고 합니다.
                - 하드디스크에서 메모리로의 로딩 
                - 메모리에서 캐쉬메모리(cpu)로의 로딩
   2. 메뉴를 보시면 파일 클릭 ->

 
 
 
거기에서 프로젝트 를 켜시면 C#을 선택하셔서
      콘솔응용프로그램을 클릭합니다. 그리고 프로젝트 이름을 쓰시고 확인!

   3. 그럼 기본 코드가 자동으로 나옵니다. 우린 그냥 그 안에 있는것을 다 지우고 해봅니다.
 
 
  - hello.cs

using System;

namespace A
{
    class B
    {
           static void Main()
           {
                   System.Console.WriteLine("hello, C# this is my First C# programing Code");
           }
    }
}

 
자 이렇게 누르시고 Ctrl + F5 키를 누르세요(컴파일 + 실행)
 
 
드디어, 처음으로 C#.NET 응용 프로그램을 작성해보신겁니다.     
좀 감을 잡으셨다면 System.Console.WriteLine.... 안에 글을 적으면 화면에 똑같이
찍히는걸 볼수있습니다.
처음하신분들은 많이 실망하셨을수도 있습니다. 까만 화면에 흰글자....이거 왠지 
윈도우환경에 익숙한지라 허접해 보일수 있겠지만 모든 프로그램의 학습의 기본은 콘솔환경입니다.
콘솔환경 ... 까만 화면에 흰글자...즉, 그래픽이 없는 문자명령체계 라고 ...

하지만 기본 구현학습에 있어서 콘솔환경만큼 좋은곳은 없습니다.
여기에서 잘 하셔야 나중에 현란한 윈도우창도 만들고, 눈으로도 멋진 프로그램을 만들수있으니까요
우린 디자인보다는 우선은 기능을 배워야 합니다.그것도 잘....
 이것저것 찍어보시고 많이 가지고 노시길 바랍니다.

참고로 자동으로 코드가 완성되는 기능이 있는데, 이것에 익숙해지시면 안됩니다.
부디...키보드로 직접 코딩하십시오.

코드에 대한 설명과 컴파일러에 사용은  다음장에 하겠습니다.


내용이 도움이 되었다면 xrp tip 한번^^



'프로그래밍 > C#' 카테고리의 다른 글

C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-3. 네임스페이스  (0) 2019.01.25
C#-1. C#의 특징  (1) 2019.01.23
Posted by 토실토실천재
2019. 1. 23. 16:04


C#은 닷넷개발프로그램의 대표적인 언어입니다.
기존 과거에 다른 언어의 단점을 과감히 털어벌이고, 새로운 흐름을 위한 객체지향개념의 언어입니다.

과거에도 여러가지의 언어도 혼합프로그래밍이 가능했으나, 실질적으로 
번거로움이 상당히 많았습니다.
C, 파스칼, 어셈블리의 언어의 오브젝트파일(컴파일된 파일)을 링크시켜서
하나의 실행파일을 만드는것 가능했어요.

하지만 닷넷은 이러한 혼합프로그램이 매우 수월해졌으며, 현재까지 이런 혼합프로그램이 가능한
즉, 닷넷을 지원하는 언어가 60개 정도 된다. 매우 크게 발전했다는 생각이 들기도 하면서,
닷넷의 힘이 느껴지기도 합니다.

1. C#의 특징
   1. 기반언어 : C++, 자바 ==> 고차원적으로 업그레이드
     - 특징
        1. 완벽한 객체지향언어
        2. 편리한 개발자가 사용 편리한 인터페이스 환경
        3. 메모리에 대한 사용자 부담이 없다.(자동 가비지 콜렉션기능)
        4. 타입이 엄격 및 문법이 엄격하다.
        5. 많은 문법의 확장
        6. 닷넷플랫폼의 대표적인 언어로써의 닷넷의 모든 장점을 갖고 있음. 등등등

  2. 프로그램을 한번이라도 해보신분이라면
       1. 특히, C/java를 해보신분들은 어색하지 않는 코드문법입니다.
           즉, java또한 C++을 참고했고, C++은 C의 확장이기 때문에 변수선언방식이나
           함수/메소드 등 특정기능 사용이 비슷합니다.

  3. 처음 프로그램 하신분이라면
       1. 우선적으로 코드기법을 배우는것은 위험합니다.
          - 닷넷의 등장배경, 닷넷의 기능, 닷넷이 추구하는 것등 그리고 프로그램 실행 구조
            를 먼저 파악하는것이 중요합니다. 무엇보다도, 하드웨어에 대한 기초지식이 있다면
            더더욱 좋을거 같네요.

       2. 역시나 책을 좀 많이 보셨으면 합니다. 코드를 친다고 해서 어쩌어찌 되긴 합니다만
          이론을 알고 코딩을 하는것이 훨씬 좋습니다.  처음 부터 결과를 위해서 코드를 작성
          하는것은 훈련하지 않는 달리기 선수가 10초대를 가기를 바라는것과 같습니다.
   


유용하게 보셨다면 xrp로 팁 한번 부탁드립니다.

'프로그래밍 > C#' 카테고리의 다른 글

C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-6. 데이타 타입  (0) 2019.01.29
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-3. 네임스페이스  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
Posted by 토실토실천재
2019. 1. 23. 09:20


* 문제 

  - 기존 안드로이드 개발을 안하다고 다시 하게 되니 디바이스 기능을 불러오기 위한 권한 정책이 변경

  - 언제 바뀌었나?

    + 마시멜로우 버전 부터 바뀜, 정적 보안 선언에서 => 동적(runtime) 정책 보안으로 변경

  - 코도바 플러그인 참조해서 개발하는 개발자들의 문제가 생김

  - 현재 자료를 찾아봐도 버전을 낮춰서 개발하란 말이 있음

    => 경험상 언제가 문제가 생김 (한국개발자들이 대부분 요따구로 써놨음.. 열받아서 plugin 인 개발을 하고

       테스트 중에 좋은 플러그인을 발견함...새벽까지 작업하다가 다음날 찾음..억울

         


* 해결

  - https://www.npmjs.com/package/cordova-plugin-permission 여기 가면 있음



예제) 플러그인 다운받은 후 아래 예제 참조 하시면 됨.
       저같은 경우는 전화번호를 가져오는 기능이고 
       추후에 sms와 전화걸기 등 여러기능이 연동됩니다.  
 
 



Posted by 토실토실천재
2019. 1. 21. 15:38

* 버그 내용

  - onsen ui 의 대표적 기능인 Tab의 기능에 대해서 버그 발견

  - tabbar를 사용하여 js를 이용하여 setActiveTab 을 지정하는 경우 오류 발생

  

* 버그 현상

  - 첫번째 Tab이 기본적으로 인덱싱 설정되어 문제가 발생하지 않지만

  - n번째 Tab에 강제로 Set하는 과정에서 오류 발생

  - Tab을 초기화 하는 과정에서 속도의 문제로 인한 버그 인정...


* 잠정 해결

  - 어쩔수없이 setTimeout 이라는 땜질을 실행 



var tabbr = page.querySelector("tapTabbar");

// 온센 UI 버그로 인한 setTimeOut 적용

setTimeout(function(){

tabbr.setActiveTab(index);

}, 100);

Posted by 토실토실천재
2018. 12. 16. 20:15


var div = document.getElementById("map_canvas");

var map = plugin.google.maps.Map.getMap(div);

map.one(plugin.google.maps.event.MAP_READY, function(){

console.log("Map init done!"); // DEBUG

$('.page__background')

.not('.page--menu-page__background')

.css('background-color', 'rgba(0,0,0,0)');


$(div).css( "background-color", "rgba(0,0,0,0)" );

});


맵이 onsen UI 에서만 나오지 않을 경우 대처법입니다.

구글맵은 정상적으로 로드되는걸 봐서는 CSS문제인것으로 봐서 위와같이 백그라운드를 초기화 시켜버림


* 단 Onsen UI 나 기타 모바일 프레임워크의 문제는

 웹뷰에서 실행되는 맵이 아니라는점이다. 

 이는 구글맵 자체가 안드로이드 시스템 자체에서 실행되므로

 화면상의 큰 문제를 야기 하더군요


 즉, 모든 화면에 백그라운드로 지도가 표기가 됩니다.

 이는 onsen ui의 페이지 전환시 명확하게 확인 할수 있답니다..

 저는 그래서 코도바 프로젝트에서 JS 버전의 map api 를 사용하는것을 추천합니다...


 웹뷰의 브라우저에서 실행되므로 좀 느리긴 하지만....

'모바일 > Onsen UI' 카테고리의 다른 글

Cordova android Permission 문제 (plugin 적용)  (0) 2019.01.23
Onsen UI tabbar setActiveTab 지정 오류  (0) 2019.01.21
Posted by 토실토실천재
2010. 7. 10. 02:16

제 25장 다차원 배열

  


※ 포인터, 배열은 무엇인지를...잘 숙지해야 합니다.
    ->> 더블포인터를 위한 공부를 위해서 집중하세요
        >> 포인터 개념이 이해가 안되시면 다시 포인터/배열부분 강의를
              한번 더 공부하고 오시기 바랍니다.


다차원 배열이란? ; 2차원 이상의 배열

 - 배열 선언 예)
   
   int arr[5];             // 1차원 구조
   int arr1[10][6];     // 2차원 구조
   int arr2[4][4][5];  // 3차원 구조

 ※ 2차원배열만 이해를 한다면 나머지 2+n 차원 배열이 이해가 빨라요
    tip => 2차원 이상은 실제 쓰일 경우가 거의 없습니다.

 

 


2차원 배열의 선언

  - 2차원적 메모리를 구성

 

 ex)

 int main()
{
 arr1[4]; 
 arr2[3][4]; // 3은 세로, 4는 가로를 의미라고 생각
                  // 3 X 4 인 배열 선언
 ......           // 배열크기는 3x4(12)x4byte = 48 byte

 return 0;
}

 

예제)=============================================================  

 

/* 2차원 배열 요소의 접근 방법 */

 

#include <stdio.h>

int main()
{
 int arr[3][3];
 arr[0][0] = 1;
 arr[1][0] = 2;
 arr[2][0] = 3;

                                                         
 ....

}     // 참고 : 배열 ; 상수포인터

      // 그림 : 예제이해

 

 

 

예제)=============================================================  


#include <stdio.h>

int main(void)
{
 int Array[4][2];
 int i, j;

 int number;

 for(i=0; i<4; i++)
 {
  for(j=0; j<2; j++)
  {
   printf("%d 층 %d호 인구입력 : ", i+1, j+1);
   scanf("%d", &Array[i][j]);
  }
 }

 for(i=0; i<4; i++)
 {
  number = 0;

  for(j=0; j<2; j++)
  {
   number += Array[i][j];
  }

 printf("%d 층, 총인구 : %d \n", i+1, number);

 }

 return 0;
}

================================================================  

 

 

 

다차원 배열의 실제 메모리 구성
 
 - 접근 방법을 2차원적으로 해석할뿐, 1차원 배열과 동일하다.

 

 - 2차원배열이라고해서 메모리구조는 2차적으로 되는것이 아니다.
    >> 배열선언시 2차원배열선언시, 1차원적인 배열메모리를 생각하세요
 


 - 그림참고(배열선언시 메모리구조의 모습)

 

 

 

2차원 배열 ! 선언과 동시에 초기화

 

 - 방법 1 : 행 단위로 모든 요소들을 초기화

 

 - 방법 2 : 행 단위로 일부 요소들만 초기화
   
 ex 1)

int Array[3][3] = {
 
 {1, 2, 3},
 {3, 4, 5},
 {5, 6, 7}

}


 ex 2)

int Array_1[3][3] = {

{0},       // 나머지 Array_1[0][1], Array_1[0][2]는 0으로 초기화
{1, 2},   // 나머지 Array_1[1][2]는 0으로 초기화 
{4, 5, 6}

}


 ex 3)

int Array_2[3][3] = {1, 2, 3, 4, 5, 6}; // 이렇게 해도 문법적으로 문제 없다


 

초기화 리스트에 의한 배열 크기의 결정

 

 - 1차원 배열의 예
  >> int Array[] = {1, 2, 3}; // 정상 OK

 

 - 2차원 배열의 예
  >> int Array[][] = {1, 2, 3, 4, 5, 6}        // Error!
  >> int Array[][4] = {1, 2, 3, 4, 5, 6, 7, 8} // OK
  >> int Array[][2] = {1, 2, 3, 4, 5, 6, 7, 8} // OK

 

   ===> 두개의 인덱스 모두를 생략할 수는 없다.
           둘 중에 한개의 인덱스만 선언해주면 컴파일러가 자동으로 인덱스를 인식한다.
 


3차원 배열의 선언과 의미

 

  - 3차원적 메모리를 구성(있다는것만 아시면 되요)

 

  - 일반적으로 거의 쓰이지 않는다.(배열과 포인터를 이용하기 위한 용도만...)

 

  - 4차원 이상은 4차원형태이므로 구조적인 이해가 불가

 
 

 
Posted by 토실토실천재
2010. 7. 10. 02:14

 

제 24장 포인터와 함수에 대한 이해 - 2

 

 


Call by Value (call : 함수를 호출한다)

 

 - 값의 복사에 의한 함수 호출
 
 - 가장 일반적인 함수 호출 형태

 

예제)=============================================================  

 

#include <stdio.h>

int Add(int num1, int num2); // 더하기 함수 선언

int main()
{
 int val1 = 100;
 int val2 = 200;
 
 printf("더하기값(Add 함수값) : %d \n", Add(val1, val2));

 return 0;
}

int Add(int num1, int num2) // 더하기 함수 정의
{
 return num1 + num2;
}

// main 함수내의 val1, val2값을
// Add함수에 매개변수에 복사한다는 의미

 

 

 

예제)=============================================================  


#include <stdio.h>

 

void swap(int a, int b);


int main(void)
{
 int number_1 = 10;
 int number_2 = 300;

 printf("number_1 = %d \n", number_1);
 printf("number_2 = %d \n", number_2);

 swap(number_1, number_2);

 return 0;
}

 

void swap(int a, int b)
{
 int temp;

 temp = a;
 a = b;
 b = temp;

 printf("a = %d \n", a);
 printf("b = %d \n", b);

}


// val1, val2의 값이 그대로 복사해서 Add함수의 num1, num2에 전달된다.
// 즉, val1, val2와 num1, num2는 별개의 변수다



================================================================  

 

call by Reference 
 
 - 참조(참조를 가능케 하는 주소값)를 인자로 전달하는  형태의 함수호출

 

예제)=============================================================  

 

#include <stdio.h>

 

void P_add(int* p)      // main함수의 number의 주소값을 인자로 받는다
{
 (*p)++;                     // p는 main함수의 number을 가리키므로 number값이 1증가한다.
}

int main()
{
 int number = 100; 

 P_add(&number);      // number의 주소값을 넘긴다.

 printf("number = %d \n", number);

 return 0;
}

 

================================================================  

 

 

scanf 함수 호출시 &를 붙이는 이유?

 

 - scanf("%d", &val);
   // scanf함수가 val이라는 변수에 접근하기 위해서
   // 주소값을 찾아서 실행된다.(call by reference)

 - scanf("%s", str);
   // 배열이름이 주소값이며, 포인터이름 자체가 주소값 str 이기때문에
   // &를 붙일 필요가 없다.

 

 


포인터가 가리키는 변수의 상수화

 - int a = 20;
   const int* p = &a;
   *p = 10; // Error
   a = 30;  // ok!;
 // p가 a를 봤을때만! a는 상수다
 // p라는 포인터로 a값을 변경 불가능하다!

 

 

 

포인터 상수화

 - int a = 20;
   int b = 100;
   int* const  p = &a;
   p = &b;   // Error
   *p = 30;  // ok!;
// p라는 포인터가 가리키는 값 자체를 상수화
// p는 무조건! 항상 a만 가리킬수 있음.

 - const int* const p = &a 이경우는
   위의 두가지 특징을 다 가진다.
  > p는 무조건 a만 가리키고 p를 통해서 a값을 변강할수 없다.

 

 


const 키워드를 사용하는 이유

 

 - 컴파일시 잘못된 연산에 대한 에러메시지
 
 - 프로그램을 안정적으로 구성

 

 

 

Posted by 토실토실천재