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