2019년 11월 12일 화요일

Objective-C NSMutableDictionary 활용법

오늘 포스팅 할 내용은 Objective-C 에서 주로 쓰이는 NSMutableDictionary 활용법에 대한 강좌 입니다.

NSMutableDictionary key/value 성 데이터를 관리의 목적으로 만들어진 Class 중 하나 입니다.

​NSMutableDictionary *variable = [[NSMutableDictionary alloc] init]; 과 같이 선언 하여 씁니다.

​간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


NSMutableDictionary *mapAlphaASCII = [[NSMutableDictionary alloc] init];
    
//값 할당.
for (NSInteger i = 65; i <= 90; i++)
{
    NSString *sKey;
    sKey = [NSString stringWithFormat:@"%c", (int)i];
    
    [mapAlphaASCII setValue:[NSNumber numberWithInteger:i] forKey:sKey];
}

//Key를 이용한 접근.
for (NSString *sKey in mapAlphaASCII)
{
    NSLog(@"Key[%@]=Value[%@]", sKey, [mapAlphaASCII objectForKey:sKey]);
}

//Enumerator 를 이용한 접근.
NSEnumerator *enmutor = [mapAlphaASCII objectEnumerator];
id oValue;
while (oValue = [enmutor nextObject])
{
    NSLog(@"Value[%@]", oValue);
}
< 위 코드는 XCode 11.2 Objective-C 에서 빌드 되었습니다 >

코드에서 염두하실것은 NSMutableDictionary 는 NSObject 를 상속받은 객체만을 멤버로 가질수 있습니다.

​일반적인 타입의 경우 멤버로 추가될수 없기 때문에 NSInteger 의 경우도 NSNumber 객체로 변환하여 멤버로 추가 되었습니다.

멤버를 접근 하는 방법은 Key 고속접근/Enumerator 를 이용하는 방법으로 구현 하였습니다.

NSMutableDictionary 관련 상세한 인터페이스는 https://developer.apple.com/documentation/foundation/nsmutabledictionary?language=objc 여기서 확인 하실수 있습니다.

​​제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

a. setValue : NSMutableDictionary 에 멤버를 추가 해주는 메소드 입니다.
b. count : NSMutableDictionary 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. removeAllObjects : NSMutableDictionary 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. removeObjectForKey : NSMutableDictionary 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. objectForKey : 특정 키에 해당하는 값을 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


NSMutableDictionary *mapAlphaASCII = [[NSMutableDictionary alloc] init];
    
//값 할당.
for (NSInteger i = 65; i <= 90; i++)
{
    NSString *sKey;
    sKey = [NSString stringWithFormat:@"%c", (int)i];
    
    [mapAlphaASCII setValue:[NSNumber numberWithInteger:i] forKey:sKey];
}

NSLog(@"mapAlphaASCII Member Count %ld", [mapAlphaASCII count]);

//Key를 이용한 접근.
for (NSString *sKey in mapAlphaASCII)
{
    NSLog(@"Key[%@]=Value[%@]", sKey, [mapAlphaASCII objectForKey:sKey]);
}

// B 값을 찾아 삭제.
if([mapAlphaASCII objectForKey:@"B"] != nil)
{
    [mapAlphaASCII removeObjectForKey:@"B"];
}
else
    NSLog(@"Not Found B");

NSLog(@"mapAlphaASCII Member Count %ld", [mapAlphaASCII count]);

//전체 멤버 삭제.
[mapAlphaASCII removeAllObjects];

NSLog(@"mapAlphaASCII Member Count %ld", [mapAlphaASCII count]);
NSMutableDictionary 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

2019년 11월 9일 토요일

Java HashMap 활용법.

오늘 포스팅 할 내용은 Java 에서 주로 쓰이는 HashMap 활용법에 대한 강좌 입니다.

HashMap key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

HashMap<class Key, class Value> variable; 과 같이 선언 하여 씁니다.
​
간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


package process;

import java.util.HashMap;
import java.util.Iterator;

public class HashMapSample
{
 public static void main(String[] args) throws Exception
 {
  HashMap<String, Integer> mapAlphaASCII = new HashMap<String, Integer>();

  //값 할당.
  for (int i = 65; i <= 90; i++)
  {
   String sKey;
   sKey = String.format("%c", i);
   
   mapAlphaASCII.put(sKey, Integer.valueOf(i));
  }

  // entrySet을 이용한 접근방법. 
  System.out.println("entrySet 이용한 접근...");
  for( HashMap.Entry<String, Integer> item : mapAlphaASCII.entrySet() )
  { 
   System.out.println(String.format("Key[%s]=Value[%d]", item.getKey(), item.getValue())); 
  } 

  // keySet을 이용한 접근방법.
  System.out.println("keySet을 이용한 접근...");
  for( String key : mapAlphaASCII.keySet() )
  { 
   System.out.println(String.format("Key[%s]=Value[%d]", key, mapAlphaASCII.get(key))); 
  } 

  // Iterator를 이용한 접근방법. 
  System.out.println("Iterator를 이용한 접근...");
  Iterator<String> keys = mapAlphaASCII.keySet().iterator(); 
  while( keys.hasNext() )
  { 
   String key = keys.next(); 
   System.out.println(String.format("Key[%s]=Value[%d]", key, mapAlphaASCII.get(key))); 
  }
 }
}
< 위 코드는 우분투 환경에서 javac 1.8.0_232-ea 에서 빌드 되었습니다 >

코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다.

멤버를 접근 하는 방법은 entrySet / keySet / Iterator 를 이용하는 방법으로 구현 하였습니다.

코드의 간결성을 위해 보통은 두번째 keySet을 저는 보통 사용합니다.
​
Key와 Value는 Object 를 상속 받은 객체형 타입이어야 합니다.
​
HashMap 관련 상세한 인터페이스는 https://cr.openjdk.java.net/~iris/se/11/latestSpec/api/java.base/java/util/HashMap.html 여기서 확인 하실수 있습니다.

​제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
​
a. put : HashMap 에 멤버를 추가 해주는 메소드 입니다.
b. size : HashMap 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. clear : HashMap 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. remove : HashMap 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. keySet : HashMap 의 키셋을 반환 합니다.
f. get : 특정 키에 해당하는 값을 리턴합니다.
​
위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


package process;

import java.util.HashMap;
import java.util.Iterator;

public class HashMapSample2
{
 public static void main(String[] args) throws Exception
 {
  HashMap<String, Integer> mapAlphaASCII = new HashMap<String, Integer>();

  //값 할당.
  for (int i = 65; i <= 90; i++)
  {
   String sKey;
   sKey = String.format("%c", i);
   
   mapAlphaASCII.put(sKey, Integer.valueOf(i));
  }

  System.out.println(String.format("mapAlphaASCII Member Count %d", mapAlphaASCII.size()));

  // keySet을 이용한 멤버 출력..
  for( String key : mapAlphaASCII.keySet() )
  { 
   System.out.println(String.format("Key[%s]=Value[%d]", key, mapAlphaASCII.get(key))); 
  } 

  // B 값을 찾아 삭제.
  if (mapAlphaASCII.get("B") != null)
  {
   mapAlphaASCII.remove("B"); 
  }
  else
   System.out.println(String.format("Not Found B"));

  System.out.println(String.format("mapAlphaASCII Member Count %d", mapAlphaASCII.size()));

  //전체 멤버 삭제.
  mapAlphaASCII.clear();

  System.out.println(String.format("mapAlphaASCII Member Count %d", mapAlphaASCII.size()));  
 }
}

HashMap 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

2019년 11월 8일 금요일

MFC CMap 활용법

오늘 포스팅 할 내용은 MFC 에서 주로 쓰이는 CMap 활용법에 대한 강좌 입니다.

CMap key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

CMap<class Key, class ARG_KEY, class Value, class ARG_VALUE> variable; 과 같이 선언 하여 씁니다.

ARG_KEY, ARG_VALUE 는 이전에 CArray 강의 내용에서 알려드린 내용과 동일합니다. 이전 강의 참조 하시면 됩니다.
https://ansur.blogspot.com/2019/11/mfc-carray.html
​
간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


CMap<CString, LPCTSTR, int, int&> mapAlphaASCII;

//값 할당.
for (int i = 65; i <= 90; i++)
{
 CString sKey;
 sKey.Format(_T("%c"), i);

 mapAlphaASCII.SetAt(sKey, i);
}

//값 출력..
POSITION pos = mapAlphaASCII.GetStartPosition();
CString sKey;
int nValue;
while (pos)
{
 mapAlphaASCII.GetNextAssoc(pos, sKey, nValue);
 TRACE(_T("key[%s] value[%d]\n"), sKey, nValue);
}
< 위 코드는 Visual Studio 2019 Community 에서 빌드 되었습니다 >

코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다. Key가 CString 이기 때문에 저장된 초기 위치를 얻어와서 다음 멤버가 있을떄까지 루프를 돌면서 멤버를 출력합니다.

초기 CMap 선언시에 두번쨰 ARG_KEY 타입을 CString 이 아닌 LPCTSTR 로 선언을 하였습니다.

이유는 키의 참조형 변수 인데 이건 내부적으로 키값을 접근할때 객체를 직접 접근 할수 있는 일반 타입으로 선언이 되어야 합니다.
​
CMap 관련 상세한 인터페이스는 https://docs.microsoft.com/en-us/cpp/mfc/reference/cmap-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(AFXTEMPL%2FCMap);k(CMap);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
​
a. SetAt : CMap 에 멤버를 추가 해주는 메소드 입니다.
b. GetCount/GetSize : CMap 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. RemoveAll : CMap 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. RemoveKey : CMap 에 저장된 멤버중 하나를 지우는 메소드 입니다.
e. GetStartPosition : POSITION 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.
f. GetNextAssoc : POSITION 를 이용하는 방식을 이용할때 현재 위치에서 다음 지시하는 멤버를 리턴합니다.
g. Lookup : 특정 키에 해당하는 값을 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


CMap<CString, LPCTSTR, int, int&> mapAlphaASCII;

//값 할당.
for (int i = 65; i <= 90; i++)
{
 CString sKey;
 sKey.Format(_T("%c"), i);

 mapAlphaASCII.SetAt(sKey, i);
}

TRACE(_T("mapAlphaASCII Member Count %d\n"), mapAlphaASCII.GetCount());

//POSITION 값 출력..
POSITION pos = mapAlphaASCII.GetStartPosition();
CString sKey;
int nValue;
while (pos)
{
 mapAlphaASCII.GetNextAssoc(pos, sKey, nValue);
 TRACE(_T("key[%s] value[%d]\n"), sKey, nValue);
}

// B 값을 찾아 삭제.
int nFindValue;
if (mapAlphaASCII.Lookup(_T("B"), nFindValue))
{
 if (mapAlphaASCII.RemoveKey(_T("B")))
  TRACE(_T("\"B\" is Deleted.\n"));
 else
  TRACE(_T("\"B\" is Not Deleted.\n"));
}
else
 TRACE(_T("Not Found B\n"));
 
TRACE(_T("mapAlphaASCII Member Count %d\n"), mapAlphaASCII.GetSize());

//전체 멤버 삭제.
mapAlphaASCII.RemoveAll();

TRACE(_T("mapAlphaASCII Member Count: %d\n"), mapAlphaASCII.GetCount());
CMap 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

2019년 11월 7일 목요일

Objective-C NSMutableArray 활용법

오늘 포스팅 할 내용은 Objective-C 에서 주로 쓰이는 NSMutalbeArray 활용법에 대한 강좌 입니다.

NSMutableArray 는 가변 리스트 배열을 관리 하는 클래스 입니다.

NSArray 는 멤버가 초기에 고정되어 있기 때문에 추가와 삭제를 자유롭게 하려면 NSMutableArray 를 사용 하셔야 합니다.
​
ARC 를 사용하는 환경에서
NSMutableArray* variable = [[NSMutableArray alloc] init]; 과 같이 선언 하여 씁니다.
​
간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들면서 멤버를 접근 하는 방법은 operator / objectAtIndex 을 이용하는 방법을 샘플에 적용하여 만들어 보겠습니다.

NSMutableArray* arrTest = [[NSMutableArray alloc] init];
    
for (NSInteger i=0; i<100; i++)
{
    [arrTest addObject:[NSNumber numberWithInteger:i]];
}

//operator 접근.
for (NSInteger i=0; i<[arrTest count]; i++)
{
    NSLog(@"operator arrTest[%ld]=[%@]", i, arrTest[i]);
}

//objectAtIndex 지시자 접근.
for (NSInteger i=0; i<[arrTest count]; i++)
{
    NSLog(@"objectAtIndex arrTest[%ld]=[%@]", i, [arrTest objectAtIndex:i]);
}

< 위 코드는 XCode 11.2 Objective-C 에서 빌드 되었습니다 >

코드에서 염두하실것은 NSMutableArray 는 NSObject 를 상속받은 객체만을 멤버로 가질수 있습니다.
일반적인 타입의 경우 멤버로 추가될수 없기 때문에 NSInteger 의 경우도 NSNumber 객체로 변환하여 멤버로 추가 되었습니다.

​NSMutableArray 관련 상세한 인터페이스는 https://developer.apple.com/documentation/foundation/nsmutablearray?language=objc 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
​
​a. addObject : ​NSMutableArray 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.
b. count : ​NSMutableArray 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. removeAllObjects : ​NSMutableArray 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. removeObjectAtIndex : ​NSMutableArray 에 저장된 멤버중 하나 지우는 메소드 입니다.
e. insertObject : ​NSMutableArray 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.
f. objectAtIndex : index 를 이용하여 위치에 해당하는 멤버를 리턴합니다.
g. setObject : index 를 이용하여 위치에 해당하는 멤버를 변경합니다.
h. removeObject:inRange : 주어진 범위의 멤버를 삭제 합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


NSMutableArray* arrTest = [[NSMutableArray alloc] init];
    
for (NSInteger i=0; i<100; i++)
{
    [arrTest addObject:[NSNumber numberWithInteger:i]];
}

//추가된 멤버의 갯수 출력.
NSLog(@"arrTest Count : %ld", [arrTest count]);

//20번쨰 위치에 200 엠버 추가.
[arrTest insertObject:[NSNumber numberWithInt:200] atIndex:20];
NSLog(@"arrTest Count : %ld, arrTest[20]=%@", [arrTest count], [arrTest objectAtIndex:20]);

//20번째 삽입한 200 멤버 제거.
[arrTest removeObjectAtIndex:20];

NSLog(@"arrTest Count : %ld, arrTest[20]=%@", [arrTest count], [arrTest objectAtIndex:20]);
    
//50 ~ 100 멤버 삭제.
[arrTest removeObjectsInRange:(NSRange){50, 50}];

NSLog(@"arrTest Count : %ld", [arrTest count]);
for (NSInteger i=0; i<[arrTest count]; i++)
{
    NSLog(@"arrTest[%ld]=[%@]", i, arrTest[i]);
}

//전체 멤버 삭제.
[arrTest removeAllObjects];

NSLog(@"arrTest Count : %ld", [arrTest count]);

NSMutableArray 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

구간 삭제는 50번째 부터 50개를 지운다는 의미 입니다.

2019년 11월 6일 수요일

MFC CArray 활용법

오늘 포스팅 할 내용은 MFC 에서 주로 쓰이는 CArray 활용법에 대한 강좌 입니다.

CArray 는 가변 리스트 배열을 관리 하는 클래스 입니다.

CArray<DataType, ARG_TYPE> variable; 과 같이 선언 하여 씁니다.

특이한점은 ARG_TYPE 이 하나 더 존재 하는것인데요.

이것은 쉽게 이야기 하면.

CArray<int, int> arrTest; 라고 선언을 하게 되면

arrTest 에 int 값을 추가 하고 값을 얻어 갈때 값을 복사해서 전달하는 구조입니다.

CArray<int, int&> arrTest; 라고 선언을 하게 되면

arrTest 에 int 값을 추가 하고 값을 얻어 갈때 값의 참조 포인터를 전달하는 구조입니다.

두번째 것을 써야 실제로 멤버를 얻은후 값을 변경하면 바로 적용이 가능합니다.
​
간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들면서 멤버를 접근 하는 방법은 operator / GetAt 을 이용하는 방법을 샘플에 적용하여 만들어 보겠습니다.


CArray<int, int&> arrTest;

for (int i=0; i<100; i++)
{
 arrTest.Add(i);
}

//operator [] 이용하여 멤버 접근.
for (int i=0; i<arrTest.GetCount(); i++)
{
 TRACE(_T("operator arrTest[%d]=[%d]\n"), i, arrTest[i]);
}

//GetAt 이용하여 멤버 접근
for (int i = 0; i < arrTest.GetCount(); i++)
{
 TRACE(_T("GetAt arrTest.GetAt(%d)=[%d]\n"), i, arrTest.GetAt(i));
}
< 위 코드는 Visual Studio 2019 Community 에서 빌드 되었습니다 >

​CArray 관련 상세한 인터페이스는 https://docs.microsoft.com/en-us/cpp/mfc/reference/carray-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DEN-US%26k%3Dk(AFXTEMPL%2FCArray);k(CArray);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
​
​a. Add : CArray 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.
b. GetCount : CArray 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. RemoveAll : CArray 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. RemoveAt : CArray 에 저장된 멤버중 하나 지우는 메소드 입니다.
e. InsertAt : ArrayList 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.
f. GetAt : index 를 이용하여 위치에 해당하는 멤버를 리턴합니다.
g. SetAt : index 를 이용하여 위치에 해당하는 멤버를 변경합니다.
​
위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


CArray<int, int&> arrTest;

for (int i = 0; i < 100; i++)
{
 arrTest.Add(i);
}

//추가된 멤버의 갯수 출력.
TRACE(_T("arrTest Count : %d\n"), arrTest.GetCount());

//20번쨰 위치에 200 엠버 추가.
int nInsert = 200;
arrTest.InsertAt(20, nInsert, 1);

TRACE(_T("arrTest Count : %d, arrTest[20]=%d\n"), arrTest.GetCount(), arrTest.GetAt(20));

//20번째 삽입한 200 멤버 제거.
arrTest.RemoveAt(20, 1);

TRACE(_T("arrTest Count : %d, arrTest[20]=%d\n"), arrTest.GetCount(), arrTest.GetAt(20));
 
//50 ~ 100 멤버 삭제.
arrTest.RemoveAt(50, 50);

TRACE(_T("arrTest Count : %d\n"), arrTest.GetCount());
for (int i=0; i<arrTest.GetCount(); i++)
{
 TRACE(_T("arrTest[%d] Member [%d]\n"), i, arrTest[i]);
}

//전체 멤버 삭제.
arrTest.RemoveAll();

TRACE(_T("arrTest Count : %d\n"), arrTest.GetCount());
CArray 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

위코드중에 중간 삽입시 arrTest 두번째 파라메터가 int& 이걸로 정의가 되어 있기 때문에 일반 상수 즉 200 값을 바로 넣을수 없구 멤버 변수에 값을 할당하여 추가 해야 합니다.
​
구간 삭제는 50번째 부터 50개를 지운다는 의미 입니다.

Java ArrayList 활용법

오늘 포스팅 할 내용은 Java 에서 주로 쓰이는 ArrayList 활용법에 대한 강좌 입니다.

ArrayList 는 가변 리스트 배열을 관리 하는 클래스 입니다.

ArrayList<DataType> variable = new ArrayList<DataType>(); 과 같이 선언 하여 씁니다.
​
간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들면서 멤버를 접근 하는 방법은 전통적인 방식/Iterator 를 이용하는 방법/고속 접근 방법을 이용하는 법을 샘플에 적용하여 만들어 보겠습니다.


package process;

import java.util.ArrayList;
import java.util.Iterator;

public class ArraySample
{
 public static void main(String[] args) throws Exception
 {
  ArrayList<Integer> arrTest = new ArrayList<Integer>();

  for (int i=0; i<100; i++)
  {
   arrTest.add(Integer.valueOf(i));
  }

  //전통적인 접근 방법.
  for (int i=0; i<arrTest.size(); i++)
  {
   System.out.println(String.format("Normal i(%d)=[%d]", i, arrTest.get(i)));
  }

  //iterator 를 통한 접근 방법.
  Iterator<Integer> iteLoop = arrTest.iterator();
  while(iteLoop.hasNext())
  {
   System.out.println(String.format("iterator [%d]", iteLoop.next())); 
  }

  //진보된 접근 방법.
  for (Integer nTemp : arrTest )
  {
   System.out.println(String.format("Advance Access [%d]", nTemp));  
  }
 }
}
< 위 코드는 우분투 환경에서 javac 1.8.0_232-ea 에서 빌드 되었습니다 >

ArrayList 관련 상세한 인터페이스는 https://cr.openjdk.java.net/~iris/se/11/latestSpec/api/java.base/java/util/ArrayList.html#%3Cinit%3E() 여기서 확인 하실수 있습니다.

​제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

​a. add(E) : ArrayList 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.
b. size : ArrayList 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. clear : ArrayList 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. remove : ArrayList 에 저장된 멤버중 하나 지우는 메소드 입니다.
e. add(index, E) : ArrayList 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.
f. get : index 를 이용하여 위치에 해당하는 멤버를 리턴합니다.
g. set : index 를 이용하여 위치에 해당하는 멤버를 변경합니다.
h. indexOf : 멤버중 입력으로 파라메터와 동일한 값을 가진 멤버의 인덱스를 리턴합니다.
​
위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


package process;

import java.util.ArrayList;
import java.util.Iterator;

public class ArraySample2
{
 public static void main(String[] args) throws Exception
 {
  ArrayList<Integer> arrTest = new ArrayList<Integer>();

  for (int i=0; i<100; i++)
  {
   arrTest.add(Integer.valueOf(i));
  }

  //추가된 멤버의 갯수 출력.
  System.out.println(String.format("arrTest Count : %d", arrTest.size()));

  //20번쨰 위치에 200 엠버 추가.
     arrTest.add(20, Integer.valueOf(200));

     System.out.println(String.format("arrTest Count : %d, arrTest[20]=%d", arrTest.size(), arrTest.get(20)));

     //20번째 삽입한 200 멤버 제거.
     arrTest.remove(20);

     System.out.println(String.format("arrTest Count : %d, arrTest[20]=%d", arrTest.size(), arrTest.get(20)));

     // 멤버 값중 88 값 있는지 체크.
     if (arrTest.indexOf(Integer.valueOf(88)) > 0)
      System.out.println(String.format("arrTest has 88 as a member."));      
     else
      System.out.println(String.format("arrTest does not have 88 as a member."));      

     //50 ~ 99 멤버 삭제.
     for (int i=50; i<100; i++)
      arrTest.remove(50);

     System.out.println(String.format("arrTest Count : %d", arrTest.size()));
     for (Integer nTemp : arrTest )
  {
   System.out.println(String.format("arrTest Member [%d]", nTemp));  
  }

  //전체 멤버 삭제.
  arrTest.clear();

  System.out.println(String.format("arrTest Count : %d", arrTest.size()));  
 }
}

ArrayList 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

위 코드 중에 구간 삭제시에 ArrayList 에서 removeRange 라는 멤버 함수를 제공 하는데 이것은 protected 로 제공 되기 때문에 클래스를 상속하여 구현 하는 방법입니다.

구간 삭제시 50번째를 지속적으로 지우는것은 하나를 지울때 마다 인덱스 값이 변하기 때문에 해당 값을 지우면서 동일한 효과를 볼수 있습니다.

2019년 11월 4일 월요일

std::map 활용법

<std::map> 활용법​

오늘 포스팅 할 내용은 C++ 에서 주로 쓰이는 STL (Stand Template Library) 중 map 활용법에 대한 강좌 입니다.
​
map 는 STL 에서 제공하는 key/value 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

map<Key, Value> variable; 과 같이 선언 하여 씁니다.

간단히 문자열 "A" ~ "Z" 까지 실제 ASCII 코드값을 매칭 하는 샘플을 만들어 보겠습니다.


#include <stdio.h>
#include <string>
#include <map>

int main()
{
 std::map<std::string, int> mapAlphaASCII;

 //값 할당.
 for (int i = 65; i <= 90; i++)
 {
  std::string sKey;
  sKey.resize(2);

  sprintf((char*)sKey.c_str(), "%c", i);

  mapAlphaASCII.insert(std::map<std::string, int>::value_type(sKey, i));
 }


 //값 출력..
 std::map<std::string, int>::iterator iteLoop;

 for (iteLoop = mapAlphaASCII.begin(); iteLoop != mapAlphaASCII.end(); iteLoop++)
 {
  printf("key[%s] value[%d]\n", iteLoop->first.c_str(), iteLoop->second);
 }

 return 0;
}
< 위 코드는 우분투 환경에서 g++ 9.2.1 에서 빌드 되었습니다 >

​코드는 중복값 체크 없이 무조건 삽입 하는 코드 입니다. 기본적으로 iterator 를 이용하여 멤버 접근 하는 방법으로 처리 하였으나 operator[] 를 이용하여 키를 직접 접근도 가능합니다.
​
map 관련 상세한 인터페이스는 http://www.cplusplus.com/reference/map/map/ 여기서 확인 하실수 있습니다.

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.
​
a. insert : map 에 멤버를 추가 해주는 메소드 입니다.
b. size : map 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.
c. clear : map 에 저장된 멤버를 모두 지우는 메소드 입니다.
d. erase : map 에 저장된 멤버중 하나 또는 그 이상을 지우는 메소드 입니다.
e. begin : iterator 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.
f. end : iterator 를 이용하는 방식을 이용할때 맨 마지막에 지시하는 멤버를 리턴합니다.
g. find : 특정 키에 해당하는 값을 iterator 값으로 리턴합니다.

위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


#include <stdio.h>
#include <string>
#include <map>

int main()
{
 std::map<std::string, int> mapAlphaASCII;

 //값 할당.
 for (int i = 65; i <= 90; i++)
 {
  std::string sKey;
  sKey.resize(2);

  sprintf((char*)sKey.c_str(), "%c", i);

  mapAlphaASCII.insert(std::map<std::string, int>::value_type(sKey, i));
 }

 printf("mapAlphaASCII Member Count %d\n", (int)mapAlphaASCII.size());

 //operator [] 값 출력.
 for (int i = 65; i < (65+mapAlphaASCII.size()); i++)
 {
  std::string sKey;
  sKey.resize(2);

  sprintf((char*)sKey.c_str(), "%c", i);

  printf("operator key[%s] value[%d]\n", sKey.c_str(), mapAlphaASCII[sKey]);
 }

 //iterator 값 출력..
 std::map<std::string, int>::iterator iteLoop;

 for (iteLoop = mapAlphaASCII.begin(); iteLoop != mapAlphaASCII.end(); iteLoop++)
 {
  printf("iterator key[%s] value[%d]\n", iteLoop->first.c_str(), iteLoop->second);
 }

 // B 값을 찾아 삭제.
 std::map<std::string, int>::iterator iteDelB;

 std::string sKeyB;
 sKeyB.resize(2);
 sprintf((char*)sKeyB.c_str(), "B"); 
 iteDelB = mapAlphaASCII.find(sKeyB);

 if (iteDelB != mapAlphaASCII.end())
 {
  mapAlphaASCII.erase(iteDelB);
 }
 else
  printf("Not Found B\n");

 printf("mapAlphaASCII Member Count %d\n", (int)mapAlphaASCII.size());

 //전체 멤버 삭제.
    mapAlphaASCII.clear();
    // 또는 mapAlphaASCII.erase(mapAlphaASCII.begin(), mapAlphaASCII.end());

    printf("mapAlphaASCII Member Count: %d\n", (int)mapAlphaASCII.size());

 return 0;
}

map 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

std::vector 활용법

오늘 포스팅 할 내용은 C++ 에서 주로 쓰이는 STL (Stand Template Library) 중 vector 활용법에 대한 강좌 입니다.
​

현재 주로 개발하시는 분들은 모바일 개발자들이 많을거라 생각을 하니 vector 라는 이름 보다는 array 라는 용어가 더 익숙 하겠지요.
​

vector 는 STL 에서 제공하는 array 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

(c++11 에서는 array 라는 클래스를 제공 하고 있습니다.)

vector<Data type> variable; 과 같이 선언 하여 씁니다.


간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들어 보겠습니다.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <vector>

int main()
{
    std::vector<int> vecTest;

    for(int i=1; i<=100; i++)
    {
        vecTest.push_back(i);
    }

    for(int i=0; i<100; i++)
    {
        printf("vector[%d]=%d\n", i, vecTest[i]);
    }

    return 0;
}

< 위 코드는 우분투 환경에서 g++ 9.2.1 에서 빌드 되었습니다 >

​

코드를 보시면 알겠지만 일반적인 C언어 array 를 다루는것과 별차이는 없지만 기존 array처럼 고정 영역을 할당해서 관리하는것이 아닌 내부 저장 되는 영역을 push_back 이라는 멤버 함수의 호출로 지속적으로 추가 하는 방식으로 유동적인 메모리 핸들링을 위해서 많이 쓰이는 템플릿 클래스 입니다.

​

vector 관련 상세한 인터페이스는 http://www.cplusplus.com/reference/vector/vector/ 여기서 확인 하실수 있습니다.

​

제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.

​

a. push_back : vector 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.

b. size : vector 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.

c. clear : vector 에 저장된 멤버를 모두 지우는 메소드 입니다.

d. erase : vector 에 저장된 멤버중 하나 또는 그 이상을 지우는 메소드 입니다.

e. insert : vector 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.

f. begin : iterator 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.

g. end : iterator 를 이용하는 방식을 이용할때 맨 마지막에 지시하는 멤버를 리턴합니다.

​
위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <vector>

int main()
{
    std::vector<int> vecTest;

    //초기 멤버 추가.
    for(int i=1; i<=100; i++)
    {
        vecTest.push_back(i);
    }

    //추가된 멤버의 갯수 출력.
    printf("vecTest Count : %d\n", (int)vecTest.size());

    //[] 연산자를 이용한 멤버 접근 방법.
    for(int i=0; i<100; i++)
    {
        printf("vector[%d]=%d\n", i, vecTest[i]);
    }

    //iterator 지시자를 이용한 멤버 접근 방법.
    std::vector<int>::iterator iteAccess;
    
    for(iteAccess = vecTest.begin(); iteAccess != vecTest.end(); iteAccess++) 
    { 
        printf("vector member = %d\n", *iteAccess);
    } 

    //20번쨰 위치에 200 엠버 추가.
    std::vector<int>::iterator iteInsert;
    iteInsert = vecTest.begin();
    for(int i=0; i<20; i++)
        iteInsert++;

    vecTest.insert(iteInsert, 200);

    printf("vector Count: %d, vecTest[20] = %d\n", (int)vecTest.size(), vecTest[20]);

    //20번째 삽입한 200 멤버 제거.
    std::vector<int>::iterator iteDelete;
    iteDelete = vecTest.begin();

    vecTest.erase(iteDelete+20);

    printf("vector Count: %d, vecTest[20] = %d\n", (int)vecTest.size(), vecTest[20]);

    //50 ~ 100 멤버 삭제.
    std::vector<int>::iterator iteRangeDel;
    iteRangeDel = vecTest.begin();

    vecTest.erase(iteRangeDel+50, iteRangeDel+100);

    printf("vector Count: %d\n", (int)vecTest.size());

    //전체 멤버 삭제.
    vecTest.clear();
    // 또는 vecTest.erase(vecTest.begin(), vecTest.end());

    printf("vector Count: %d\n", (int)vecTest.size());

    return 0;
}

vector 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

vector 는 기본적으로 선형 저장 클래스 입니다. 기능적으로 중간 삭제나 삽입 기능이 존재 하지만 성능상으로는 크게 좋지는 않기 때문에 순차적인 저장과 접근을 쓰는데 쓰시는게 더욱 용이합니다.