'전체 글'에 해당되는 글 678건

  1. 2011.08.13 Chinese Character Codes
  2. 2011.08.13 CDatabase 을 사용한 엑셀 데이터 수정
  3. 2011.08.13 cast 연산자
  4. 2011.08.13 c++ 추상 기초클래스

http://www.khngai.com/chinese/charmap/

 

 

GB 2312 Character Map, 0xA1A0 - 0xA9FF

  0 1 2 3 4 5 6 7 8 9 a b c d e f
A1A0     、 。 · ˉ ˇ ¨ 〃 々 — ~ ‖ … ‘ ’
A1B0 “ ” 〔 〕 〈 〉 《 》 「 」 『 』 〖 〗 【 】
A1C0 ± × ÷ ∶ ∧ ∨ ∑ ∏ ∪ ∩ ∈ ∷ √ ⊥ ∥ ∠
A1D0 ⌒ ⊙ ∫ ∮ ≡ ≌ ≈ ∽ ∝ ≠ ≮ ≯ ≤ ≥ ∞ ∵
A1E0 ∴ ♂ ♀ ° ′ ″ ℃ $ ¤ ¢ £ ‰ § № ☆ ★
A1F0 ○ ● ◎ ◇ ◆ □ ■ △ ▲ ※ → ← ↑ ↓ 〓  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A2A0                                
A2B0   ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖
A2C0 ⒗ ⒘ ⒙ ⒚ ⒛ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾
A2D0 ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ① ② ③ ④ ⑤ ⑥ ⑦
A2E0 ⑧ ⑨ ⑩     ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩  
A2F0   Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ      
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A3A0   ! " # ¥ % & ' ( ) * + , - . /
A3B0 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
A3C0 @ A B C D E F G H I J K L M N O
A3D0 P Q R S T U V W X Y Z [ \ ] ^ _
A3E0 ` a b c d e f g h i j k l m n o
A3F0 p q r s t u v w x y z { | }  ̄  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A4A0   ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く
A4B0 ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た
A4C0 だ ち ぢ っ つ づ て で と ど な に ぬ ね の は
A4D0 ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み
A4E0 む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ
A4F0 ゐ ゑ を ん                        
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A5A0   ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク
A5B0 グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ
A5C0 ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ
A5D0 バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ
A5E0 ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ
A5F0 ヰ ヱ ヲ ン ヴ ヵ ヶ                  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A6A0   Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο
A6B0 Π Ρ Σ Τ Υ Φ Χ Ψ Ω              
A6C0   α β γ δ ε ζ η θ ι κ λ μ ν ξ ο
A6D0 π ρ σ τ υ φ χ ψ ω              
A6E0                                
A6F0                                
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A7A0   А Б В Г Д Е Ё Ж З И Й К Л М Н
A7B0 О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э
A7C0 Ю Я                            
A7D0   а б в г д е ё ж з и й к л м н
A7E0 о п р с т у ф х ц ч ш щ ъ ы ь э
A7F0 ю я                            
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A8A0   ā á ǎ à ē é ě è ī í ǐ ì ō ó ǒ
A8B0 ò ū ú ǔ ù ǖ ǘ ǚ ǜ ü ê          
A8C0           ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ
A8D0 ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ
A8E0 ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ            
A8F0                                
  0 1 2 3 4 5 6 7 8 9 a b c d e f
A9A0         ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋
A9B0 ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛
A9C0 ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫
A9D0 ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻
A9E0 ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋
A9F0                                

 

GB 2312 Character Map, 0xB0A0 - 0xBFFF

  0 1 2 3 4 5 6 7 8 9 a b c d e f
B0A0   啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘
B0B0 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翱
B0C0 袄 傲 奥 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋
B0D0 靶 把 耙 坝 霸 罢 爸 白 柏 百 摆 佰 败 拜 稗 斑
B0E0 班 搬 扳 般 颁 板 版 扮 拌 伴 瓣 半 办 绊 邦 帮
B0F0 梆 榜 膀 绑 棒 磅 蚌 镑 傍 谤 苞 胞 包 褒 剥  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B1A0   薄 雹 保 堡 饱 宝 抱 报 暴 豹 鲍 爆 杯 碑 悲
B1B0 卑 北 辈 背 贝 钡 倍 狈 备 惫 焙 被 奔 苯 本 笨
B1C0 崩 绷 甭 泵 蹦 迸 逼 鼻 比 鄙 笔 彼 碧 蓖 蔽 毕
B1D0 毙 毖 币 庇 痹 闭 敝 弊 必 辟 壁 臂 避 陛 鞭 边
B1E0 编 贬 扁 便 变 卞 辨 辩 辫 遍 标 彪 膘 表 鳖 憋
B1F0 别 瘪 彬 斌 濒 滨 宾 摈 兵 冰 柄 丙 秉 饼 炳  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B2A0   病 并 玻 菠 播 拨 钵 波 博 勃 搏 铂 箔 伯 帛
B2B0 舶 脖 膊 渤 泊 驳 捕 卜 哺 补 埠 不 布 步 簿 部
B2C0 怖 擦 猜 裁 材 才 财 睬 踩 采 彩 菜 蔡 餐 参 蚕
B2D0 残 惭 惨 灿 苍 舱 仓 沧 藏 操 糙 槽 曹 草 厕 策
B2E0 侧 册 测 层 蹭 插 叉 茬 茶 查 碴 搽 察 岔 差 诧
B2F0 拆 柴 豺 搀 掺 蝉 馋 谗 缠 铲 产 阐 颤 昌 猖  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B3A0   场 尝 常 长 偿 肠 厂 敞 畅 唱 倡 超 抄 钞 朝
B3B0 嘲 潮 巢 吵 炒 车 扯 撤 掣 彻 澈 郴 臣 辰 尘 晨
B3C0 忱 沉 陈 趁 衬 撑 称 城 橙 成 呈 乘 程 惩 澄 诚
B3D0 承 逞 骋 秤 吃 痴 持 匙 池 迟 弛 驰 耻 齿 侈 尺
B3E0 赤 翅 斥 炽 充 冲 虫 崇 宠 抽 酬 畴 踌 稠 愁 筹
B3F0 仇 绸 瞅 丑 臭 初 出 橱 厨 躇 锄 雏 滁 除 楚  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B4A0   础 储 矗 搐 触 处 揣 川 穿 椽 传 船 喘 串 疮
B4B0 窗 幢 床 闯 创 吹 炊 捶 锤 垂 春 椿 醇 唇 淳 纯
B4C0 蠢 戳 绰 疵 茨 磁 雌 辞 慈 瓷 词 此 刺 赐 次 聪
B4D0 葱 囱 匆 从 丛 凑 粗 醋 簇 促 蹿 篡 窜 摧 崔 催
B4E0 脆 瘁 粹 淬 翠 村 存 寸 磋 撮 搓 措 挫 错 搭 达
B4F0 答 瘩 打 大 呆 歹 傣 戴 带 殆 代 贷 袋 待 逮  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B5A0   怠 耽 担 丹 单 郸 掸 胆 旦 氮 但 惮 淡 诞 弹
B5B0 蛋 当 挡 党 荡 档 刀 捣 蹈 倒 岛 祷 导 到 稻 悼
B5C0 道 盗 德 得 的 蹬 灯 登 等 瞪 凳 邓 堤 低 滴 迪
B5D0 敌 笛 狄 涤 翟 嫡 抵 底 地 蒂 第 帝 弟 递 缔 颠
B5E0 掂 滇 碘 点 典 靛 垫 电 佃 甸 店 惦 奠 淀 殿 碉
B5F0 叼 雕 凋 刁 掉 吊 钓 调 跌 爹 碟 蝶 迭 谍 叠  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B6A0   丁 盯 叮 钉 顶 鼎 锭 定 订 丢 东 冬 董 懂 动
B6B0 栋 侗 恫 冻 洞 兜 抖 斗 陡 豆 逗 痘 都 督 毒 犊
B6C0 独 读 堵 睹 赌 杜 镀 肚 度 渡 妒 端 短 锻 段 断
B6D0 缎 堆 兑 队 对 墩 吨 蹲 敦 顿 囤 钝 盾 遁 掇 哆
B6E0 多 夺 垛 躲 朵 跺 舵 剁 惰 堕 蛾 峨 鹅 俄 额 讹
B6F0 娥 恶 厄 扼 遏 鄂 饿 恩 而 儿 耳 尔 饵 洱 二  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B7A0   贰 发 罚 筏 伐 乏 阀 法 珐 藩 帆 番 翻 樊 矾
B7B0 钒 繁 凡 烦 反 返 范 贩 犯 饭 泛 坊 芳 方 肪 房
B7C0 防 妨 仿 访 纺 放 菲 非 啡 飞 肥 匪 诽 吠 肺 废
B7D0 沸 费 芬 酚 吩 氛 分 纷 坟 焚 汾 粉 奋 份 忿 愤
B7E0 粪 丰 封 枫 蜂 峰 锋 风 疯 烽 逢 冯 缝 讽 奉 凤
B7F0 佛 否 夫 敷 肤 孵 扶 拂 辐 幅 氟 符 伏 俘 服  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B8A0   浮 涪 福 袱 弗 甫 抚 辅 俯 釜 斧 脯 腑 府 腐
B8B0 赴 副 覆 赋 复 傅 付 阜 父 腹 负 富 讣 附 妇 缚
B8C0 咐 噶 嘎 该 改 概 钙 盖 溉 干 甘 杆 柑 竿 肝 赶
B8D0 感 秆 敢 赣 冈 刚 钢 缸 肛 纲 岗 港 杠 篙 皋 高
B8E0 膏 羔 糕 搞 镐 稿 告 哥 歌 搁 戈 鸽 胳 疙 割 革
B8F0 葛 格 蛤 阁 隔 铬 个 各 给 根 跟 耕 更 庚 羹  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
B9A0   埂 耿 梗 工 攻 功 恭 龚 供 躬 公 宫 弓 巩 汞
B9B0 拱 贡 共 钩 勾 沟 苟 狗 垢 构 购 够 辜 菇 咕 箍
B9C0 估 沽 孤 姑 鼓 古 蛊 骨 谷 股 故 顾 固 雇 刮 瓜
B9D0 剐 寡 挂 褂 乖 拐 怪 棺 关 官 冠 观 管 馆 罐 惯
B9E0 灌 贯 光 广 逛 瑰 规 圭 硅 归 龟 闺 轨 鬼 诡 癸
B9F0 桂 柜 跪 贵 刽 辊 滚 棍 锅 郭 国 果 裹 过 哈  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
BAA0   骸 孩 海 氦 亥 害 骇 酣 憨 邯 韩 含 涵 寒 函
BAB0 喊 罕 翰 撼 捍 旱 憾 悍 焊 汗 汉 夯 杭 航 壕 嚎
BAC0 豪 毫 郝 好 耗 号 浩 呵 喝 荷 菏 核 禾 和 何 合
BAD0 盒 貉 阂 河 涸 赫 褐 鹤 贺 嘿 黑 痕 很 狠 恨 哼
BAE0 亨 横 衡 恒 轰 哄 烘 虹 鸿 洪 宏 弘 红 喉 侯 猴
BAF0 吼 厚 候 后 呼 乎 忽 瑚 壶 葫 胡 蝴 狐 糊 湖  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
BBA0   弧 虎 唬 护 互 沪 户 花 哗 华 猾 滑 画 划 化
BBB0 话 槐 徊 怀 淮 坏 欢 环 桓 还 缓 换 患 唤 痪 豢
BBC0 焕 涣 宦 幻 荒 慌 黄 磺 蝗 簧 皇 凰 惶 煌 晃 幌
BBD0 恍 谎 灰 挥 辉 徽 恢 蛔 回 毁 悔 慧 卉 惠 晦 贿
BBE0 秽 会 烩 汇 讳 诲 绘 荤 昏 婚 魂 浑 混 豁 活 伙
BBF0 火 获 或 惑 霍 货 祸 击 圾 基 机 畸 稽 积 箕  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
BCA0   肌 饥 迹 激 讥 鸡 姬 绩 缉 吉 极 棘 辑 籍 集
BCB0 及 急 疾 汲 即 嫉 级 挤 几 脊 己 蓟 技 冀 季 伎
BCC0 祭 剂 悸 济 寄 寂 计 记 既 忌 际 妓 继 纪 嘉 枷
BCD0 夹 佳 家 加 荚 颊 贾 甲 钾 假 稼 价 架 驾 嫁 歼
BCE0 监 坚 尖 笺 间 煎 兼 肩 艰 奸 缄 茧 检 柬 碱 硷
BCF0 拣 捡 简 俭 剪 减 荐 槛 鉴 践 贱 见 键 箭 件  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
BDA0   健 舰 剑 饯 渐 溅 涧 建 僵 姜 将 浆 江 疆 蒋
BDB0 桨 奖 讲 匠 酱 降 蕉 椒 礁 焦 胶 交 郊 浇 骄 娇
BDC0 嚼 搅 铰 矫 侥 脚 狡 角 饺 缴 绞 剿 教 酵 轿 较
BDD0 叫 窖 揭 接 皆 秸 街 阶 截 劫 节 桔 杰 捷 睫 竭
BDE0 洁 结 解 姐 戒 藉 芥 界 借 介 疥 诫 届 巾 筋 斤
BDF0 金 今 津 襟 紧 锦 仅 谨 进 靳 晋 禁 近 烬 浸  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
BEA0   尽 劲 荆 兢 茎 睛 晶 鲸 京 惊 精 粳 经 井 警
BEB0 景 颈 静 境 敬 镜 径 痉 靖 竟 竞 净 炯 窘 揪 究
BEC0 纠 玖 韭 久 灸 九 酒 厩 救 旧 臼 舅 咎 就 疚 鞠
BED0 拘 狙 疽 居 驹 菊 局 咀 矩 举 沮 聚 拒 据 巨 具
BEE0 距 踞 锯 俱 句 惧 炬 剧 捐 鹃 娟 倦 眷 卷 绢 撅
BEF0 攫 抉 掘 倔 爵 觉 决 诀 绝 均 菌 钧 军 君 峻  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
BFA0   俊 竣 浚 郡 骏 喀 咖 卡 咯 开 揩 楷 凯 慨 刊
BFB0 堪 勘 坎 砍 看 康 慷 糠 扛 抗 亢 炕 考 拷 烤 靠
BFC0 坷 苛 柯 棵 磕 颗 科 壳 咳 可 渴 克 刻 客 课 肯
BFD0 啃 垦 恳 坑 吭 空 恐 孔 控 抠 口 扣 寇 枯 哭 窟
BFE0 苦 酷 库 裤 夸 垮 挎 跨 胯 块 筷 侩 快 宽 款 匡
BFF0 筐 狂 框 矿 眶 旷 况 亏 盔 岿 窥 葵 奎 魁 傀  

 

GB 2312 Character Map, 0xC0A0 - 0xCFFF

  0 1 2 3 4 5 6 7 8 9 a b c d e f
C0A0   馈 愧 溃 坤 昆 捆 困 括 扩 廓 阔 垃 拉 喇 蜡
C0B0 腊 辣 啦 莱 来 赖 蓝 婪 栏 拦 篮 阑 兰 澜 谰 揽
C0C0 览 懒 缆 烂 滥 琅 榔 狼 廊 郎 朗 浪 捞 劳 牢 老
C0D0 佬 姥 酪 烙 涝 勒 乐 雷 镭 蕾 磊 累 儡 垒 擂 肋
C0E0 类 泪 棱 楞 冷 厘 梨 犁 黎 篱 狸 离 漓 理 李 里
C0F0 鲤 礼 莉 荔 吏 栗 丽 厉 励 砾 历 利 傈 例 俐  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C1A0   痢 立 粒 沥 隶 力 璃 哩 俩 联 莲 连 镰 廉 怜
C1B0 涟 帘 敛 脸 链 恋 炼 练 粮 凉 梁 粱 良 两 辆 量
C1C0 晾 亮 谅 撩 聊 僚 疗 燎 寥 辽 潦 了 撂 镣 廖 料
C1D0 列 裂 烈 劣 猎 琳 林 磷 霖 临 邻 鳞 淋 凛 赁 吝
C1E0 拎 玲 菱 零 龄 铃 伶 羚 凌 灵 陵 岭 领 另 令 溜
C1F0 琉 榴 硫 馏 留 刘 瘤 流 柳 六 龙 聋 咙 笼 窿  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C2A0   隆 垄 拢 陇 楼 娄 搂 篓 漏 陋 芦 卢 颅 庐 炉
C2B0 掳 卤 虏 鲁 麓 碌 露 路 赂 鹿 潞 禄 录 陆 戮 驴
C2C0 吕 铝 侣 旅 履 屡 缕 虑 氯 律 率 滤 绿 峦 挛 孪
C2D0 滦 卵 乱 掠 略 抡 轮 伦 仑 沦 纶 论 萝 螺 罗 逻
C2E0 锣 箩 骡 裸 落 洛 骆 络 妈 麻 玛 码 蚂 马 骂 嘛
C2F0 吗 埋 买 麦 卖 迈 脉 瞒 馒 蛮 满 蔓 曼 慢 漫  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C3A0   谩 芒 茫 盲 氓 忙 莽 猫 茅 锚 毛 矛 铆 卯 茂
C3B0 冒 帽 貌 贸 么 玫 枚 梅 酶 霉 煤 没 眉 媒 镁 每
C3C0 美 昧 寐 妹 媚 门 闷 们 萌 蒙 檬 盟 锰 猛 梦 孟
C3D0 眯 醚 靡 糜 迷 谜 弥 米 秘 觅 泌 蜜 密 幂 棉 眠
C3E0 绵 冕 免 勉 娩 缅 面 苗 描 瞄 藐 秒 渺 庙 妙 蔑
C3F0 灭 民 抿 皿 敏 悯 闽 明 螟 鸣 铭 名 命 谬 摸  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C4A0   摹 蘑 模 膜 磨 摩 魔 抹 末 莫 墨 默 沫 漠 寞
C4B0 陌 谋 牟 某 拇 牡 亩 姆 母 墓 暮 幕 募 慕 木 目
C4C0 睦 牧 穆 拿 哪 呐 钠 那 娜 纳 氖 乃 奶 耐 奈 南
C4D0 男 难 囊 挠 脑 恼 闹 淖 呢 馁 内 嫩 能 妮 霓 倪
C4E0 泥 尼 拟 你 匿 腻 逆 溺 蔫 拈 年 碾 撵 捻 念 娘
C4F0 酿 鸟 尿 捏 聂 孽 啮 镊 镍 涅 您 柠 狞 凝 宁  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C5A0   拧 泞 牛 扭 钮 纽 脓 浓 农 弄 奴 努 怒 女 暖
C5B0 虐 疟 挪 懦 糯 诺 哦 欧 鸥 殴 藕 呕 偶 沤 啪 趴
C5C0 爬 帕 怕 琶 拍 排 牌 徘 湃 派 攀 潘 盘 磐 盼 畔
C5D0 判 叛 乓 庞 旁 耪 胖 抛 咆 刨 炮 袍 跑 泡 呸 胚
C5E0 培 裴 赔 陪 配 佩 沛 喷 盆 砰 抨 烹 澎 彭 蓬 棚
C5F0 硼 篷 膨 朋 鹏 捧 碰 坯 砒 霹 批 披 劈 琵 毗  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C6A0   啤 脾 疲 皮 匹 痞 僻 屁 譬 篇 偏 片 骗 飘 漂
C6B0 瓢 票 撇 瞥 拼 频 贫 品 聘 乒 坪 苹 萍 平 凭 瓶
C6C0 评 屏 坡 泼 颇 婆 破 魄 迫 粕 剖 扑 铺 仆 莆 葡
C6D0 菩 蒲 埔 朴 圃 普 浦 谱 曝 瀑 期 欺 栖 戚 妻 七
C6E0 凄 漆 柒 沏 其 棋 奇 歧 畦 崎 脐 齐 旗 祈 祁 骑
C6F0 起 岂 乞 企 启 契 砌 器 气 迄 弃 汽 泣 讫 掐  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C7A0   恰 洽 牵 扦 钎 铅 千 迁 签 仟 谦 乾 黔 钱 钳
C7B0 前 潜 遣 浅 谴 堑 嵌 欠 歉 枪 呛 腔 羌 墙 蔷 强
C7C0 抢 橇 锹 敲 悄 桥 瞧 乔 侨 巧 鞘 撬 翘 峭 俏 窍
C7D0 切 茄 且 怯 窃 钦 侵 亲 秦 琴 勤 芹 擒 禽 寝 沁
C7E0 青 轻 氢 倾 卿 清 擎 晴 氰 情 顷 请 庆 琼 穷 秋
C7F0 丘 邱 球 求 囚 酋 泅 趋 区 蛆 曲 躯 屈 驱 渠  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C8A0   取 娶 龋 趣 去 圈 颧 权 醛 泉 全 痊 拳 犬 券
C8B0 劝 缺 炔 瘸 却 鹊 榷 确 雀 裙 群 然 燃 冉 染 瓤
C8C0 壤 攘 嚷 让 饶 扰 绕 惹 热 壬 仁 人 忍 韧 任 认
C8D0 刃 妊 纫 扔 仍 日 戎 茸 蓉 荣 融 熔 溶 容 绒 冗
C8E0 揉 柔 肉 茹 蠕 儒 孺 如 辱 乳 汝 入 褥 软 阮 蕊
C8F0 瑞 锐 闰 润 若 弱 撒 洒 萨 腮 鳃 塞 赛 三 叁  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
C9A0   伞 散 桑 嗓 丧 搔 骚 扫 嫂 瑟 色 涩 森 僧 莎
C9B0 砂 杀 刹 沙 纱 傻 啥 煞 筛 晒 珊 苫 杉 山 删 煽
C9C0 衫 闪 陕 擅 赡 膳 善 汕 扇 缮 墒 伤 商 赏 晌 上
C9D0 尚 裳 梢 捎 稍 烧 芍 勺 韶 少 哨 邵 绍 奢 赊 蛇
C9E0 舌 舍 赦 摄 射 慑 涉 社 设 砷 申 呻 伸 身 深 娠
C9F0 绅 神 沈 审 婶 甚 肾 慎 渗 声 生 甥 牲 升 绳  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
CAA0   省 盛 剩 胜 圣 师 失 狮 施 湿 诗 尸 虱 十 石
CAB0 拾 时 什 食 蚀 实 识 史 矢 使 屎 驶 始 式 示 士
CAC0 世 柿 事 拭 誓 逝 势 是 嗜 噬 适 仕 侍 释 饰 氏
CAD0 市 恃 室 视 试 收 手 首 守 寿 授 售 受 瘦 兽 蔬
CAE0 枢 梳 殊 抒 输 叔 舒 淑 疏 书 赎 孰 熟 薯 暑 曙
CAF0 署 蜀 黍 鼠 属 术 述 树 束 戍 竖 墅 庶 数 漱  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
CBA0   恕 刷 耍 摔 衰 甩 帅 栓 拴 霜 双 爽 谁 水 睡
CBB0 税 吮 瞬 顺 舜 说 硕 朔 烁 斯 撕 嘶 思 私 司 丝
CBC0 死 肆 寺 嗣 四 伺 似 饲 巳 松 耸 怂 颂 送 宋 讼
CBD0 诵 搜 艘 擞 嗽 苏 酥 俗 素 速 粟 僳 塑 溯 宿 诉
CBE0 肃 酸 蒜 算 虽 隋 随 绥 髓 碎 岁 穗 遂 隧 祟 孙
CBF0 损 笋 蓑 梭 唆 缩 琐 索 锁 所 塌 他 它 她 塔  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
CCA0   獭 挞 蹋 踏 胎 苔 抬 台 泰 酞 太 态 汰 坍 摊
CCB0 贪 瘫 滩 坛 檀 痰 潭 谭 谈 坦 毯 袒 碳 探 叹 炭
CCC0 汤 塘 搪 堂 棠 膛 唐 糖 倘 躺 淌 趟 烫 掏 涛 滔
CCD0 绦 萄 桃 逃 淘 陶 讨 套 特 藤 腾 疼 誊 梯 剔 踢
CCE0 锑 提 题 蹄 啼 体 替 嚏 惕 涕 剃 屉 天 添 填 田
CCF0 甜 恬 舔 腆 挑 条 迢 眺 跳 贴 铁 帖 厅 听 烃  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
CDA0   汀 廷 停 亭 庭 挺 艇 通 桐 酮 瞳 同 铜 彤 童
CDB0 桶 捅 筒 统 痛 偷 投 头 透 凸 秃 突 图 徒 途 涂
CDC0 屠 土 吐 兔 湍 团 推 颓 腿 蜕 褪 退 吞 屯 臀 拖
CDD0 托 脱 鸵 陀 驮 驼 椭 妥 拓 唾 挖 哇 蛙 洼 娃 瓦
CDE0 袜 歪 外 豌 弯 湾 玩 顽 丸 烷 完 碗 挽 晚 皖 惋
CDF0 宛 婉 万 腕 汪 王 亡 枉 网 往 旺 望 忘 妄 威  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
CEA0   巍 微 危 韦 违 桅 围 唯 惟 为 潍 维 苇 萎 委
CEB0 伟 伪 尾 纬 未 蔚 味 畏 胃 喂 魏 位 渭 谓 尉 慰
CEC0 卫 瘟 温 蚊 文 闻 纹 吻 稳 紊 问 嗡 翁 瓮 挝 蜗
CED0 涡 窝 我 斡 卧 握 沃 巫 呜 钨 乌 污 诬 屋 无 芜
CEE0 梧 吾 吴 毋 武 五 捂 午 舞 伍 侮 坞 戊 雾 晤 物
CEF0 勿 务 悟 误 昔 熙 析 西 硒 矽 晰 嘻 吸 锡 牺  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
CFA0   稀 息 希 悉 膝 夕 惜 熄 烯 溪 汐 犀 檄 袭 席
CFB0 习 媳 喜 铣 洗 系 隙 戏 细 瞎 虾 匣 霞 辖 暇 峡
CFC0 侠 狭 下 厦 夏 吓 掀 锨 先 仙 鲜 纤 咸 贤 衔 舷
CFD0 闲 涎 弦 嫌 显 险 现 献 县 腺 馅 羡 宪 陷 限 线
CFE0 相 厢 镶 香 箱 襄 湘 乡 翔 祥 详 想 响 享 项 巷
CFF0 橡 像 向 象 萧 硝 霄 削 哮 嚣 销 消 宵 淆 晓  

 

GB 2312 Character Map, 0xD0A0 - 0xDFFF

  0 1 2 3 4 5 6 7 8 9 a b c d e f
D0A0   小 孝 校 肖 啸 笑 效 楔 些 歇 蝎 鞋 协 挟 携
D0B0 邪 斜 胁 谐 写 械 卸 蟹 懈 泄 泻 谢 屑 薪 芯 锌
D0C0 欣 辛 新 忻 心 信 衅 星 腥 猩 惺 兴 刑 型 形 邢
D0D0 行 醒 幸 杏 性 姓 兄 凶 胸 匈 汹 雄 熊 休 修 羞
D0E0 朽 嗅 锈 秀 袖 绣 墟 戌 需 虚 嘘 须 徐 许 蓄 酗
D0F0 叙 旭 序 畜 恤 絮 婿 绪 续 轩 喧 宣 悬 旋 玄  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D1A0   选 癣 眩 绚 靴 薛 学 穴 雪 血 勋 熏 循 旬 询
D1B0 寻 驯 巡 殉 汛 训 讯 逊 迅 压 押 鸦 鸭 呀 丫 芽
D1C0 牙 蚜 崖 衙 涯 雅 哑 亚 讶 焉 咽 阉 烟 淹 盐 严
D1D0 研 蜒 岩 延 言 颜 阎 炎 沿 奄 掩 眼 衍 演 艳 堰
D1E0 燕 厌 砚 雁 唁 彦 焰 宴 谚 验 殃 央 鸯 秧 杨 扬
D1F0 佯 疡 羊 洋 阳 氧 仰 痒 养 样 漾 邀 腰 妖 瑶  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D2A0   摇 尧 遥 窑 谣 姚 咬 舀 药 要 耀 椰 噎 耶 爷
D2B0 野 冶 也 页 掖 业 叶 曳 腋 夜 液 一 壹 医 揖 铱
D2C0 依 伊 衣 颐 夷 遗 移 仪 胰 疑 沂 宜 姨 彝 椅 蚁
D2D0 倚 已 乙 矣 以 艺 抑 易 邑 屹 亿 役 臆 逸 肄 疫
D2E0 亦 裔 意 毅 忆 义 益 溢 诣 议 谊 译 异 翼 翌 绎
D2F0 茵 荫 因 殷 音 阴 姻 吟 银 淫 寅 饮 尹 引 隐  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D3A0   印 英 樱 婴 鹰 应 缨 莹 萤 营 荧 蝇 迎 赢 盈
D3B0 影 颖 硬 映 哟 拥 佣 臃 痈 庸 雍 踊 蛹 咏 泳 涌
D3C0 永 恿 勇 用 幽 优 悠 忧 尤 由 邮 铀 犹 油 游 酉
D3D0 有 友 右 佑 釉 诱 又 幼 迂 淤 于 盂 榆 虞 愚 舆
D3E0 余 俞 逾 鱼 愉 渝 渔 隅 予 娱 雨 与 屿 禹 宇 语
D3F0 羽 玉 域 芋 郁 吁 遇 喻 峪 御 愈 欲 狱 育 誉  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D4A0   浴 寓 裕 预 豫 驭 鸳 渊 冤 元 垣 袁 原 援 辕
D4B0 园 员 圆 猿 源 缘 远 苑 愿 怨 院 曰 约 越 跃 钥
D4C0 岳 粤 月 悦 阅 耘 云 郧 匀 陨 允 运 蕴 酝 晕 韵
D4D0 孕 匝 砸 杂 栽 哉 灾 宰 载 再 在 咱 攒 暂 赞 赃
D4E0 脏 葬 遭 糟 凿 藻 枣 早 澡 蚤 躁 噪 造 皂 灶 燥
D4F0 责 择 则 泽 贼 怎 增 憎 曾 赠 扎 喳 渣 札 轧  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D5A0   铡 闸 眨 栅 榨 咋 乍 炸 诈 摘 斋 宅 窄 债 寨
D5B0 瞻 毡 詹 粘 沾 盏 斩 辗 崭 展 蘸 栈 占 战 站 湛
D5C0 绽 樟 章 彰 漳 张 掌 涨 杖 丈 帐 账 仗 胀 瘴 障
D5D0 招 昭 找 沼 赵 照 罩 兆 肇 召 遮 折 哲 蛰 辙 者
D5E0 锗 蔗 这 浙 珍 斟 真 甄 砧 臻 贞 针 侦 枕 疹 诊
D5F0 震 振 镇 阵 蒸 挣 睁 征 狰 争 怔 整 拯 正 政  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D6A0   帧 症 郑 证 芝 枝 支 吱 蜘 知 肢 脂 汁 之 织
D6B0 职 直 植 殖 执 值 侄 址 指 止 趾 只 旨 纸 志 挚
D6C0 掷 至 致 置 帜 峙 制 智 秩 稚 质 炙 痔 滞 治 窒
D6D0 中 盅 忠 钟 衷 终 种 肿 重 仲 众 舟 周 州 洲 诌
D6E0 粥 轴 肘 帚 咒 皱 宙 昼 骤 珠 株 蛛 朱 猪 诸 诛
D6F0 逐 竹 烛 煮 拄 瞩 嘱 主 著 柱 助 蛀 贮 铸 筑  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D7A0   住 注 祝 驻 抓 爪 拽 专 砖 转 撰 赚 篆 桩 庄
D7B0 装 妆 撞 壮 状 椎 锥 追 赘 坠 缀 谆 准 捉 拙 卓
D7C0 桌 琢 茁 酌 啄 着 灼 浊 兹 咨 资 姿 滋 淄 孜 紫
D7D0 仔 籽 滓 子 自 渍 字 鬃 棕 踪 宗 综 总 纵 邹 走
D7E0 奏 揍 租 足 卒 族 祖 诅 阻 组 钻 纂 嘴 醉 最 罪
D7F0 尊 遵 昨 左 佐 柞 做 作 坐 座            
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D8A0   亍 丌 兀 丐 廿 卅 丕 亘 丞 鬲 孬 噩 丨 禺 丿
D8B0 匕 乇 夭 爻 卮 氐 囟 胤 馗 毓 睾 鼗 丶 亟 鼐 乜
D8C0 乩 亓 芈 孛 啬 嘏 仄 厍 厝 厣 厥 厮 靥 赝 匚 叵
D8D0 匦 匮 匾 赜 卦 卣 刂 刈 刎 刭 刳 刿 剀 剌 剞 剡
D8E0 剜 蒯 剽 劂 劁 劐 劓 冂 罔 亻 仃 仉 仂 仨 仡 仫
D8F0 仞 伛 仳 伢 佤 仵 伥 伧 伉 伫 佞 佧 攸 佚 佝  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
D9A0   佟 佗 伲 伽 佶 佴 侑 侉 侃 侏 佾 佻 侪 佼 侬
D9B0 侔 俦 俨 俪 俅 俚 俣 俜 俑 俟 俸 倩 偌 俳 倬 倏
D9C0 倮 倭 俾 倜 倌 倥 倨 偾 偃 偕 偈 偎 偬 偻 傥 傧
D9D0 傩 傺 僖 儆 僭 僬 僦 僮 儇 儋 仝 氽 佘 佥 俎 龠
D9E0 汆 籴 兮 巽 黉 馘 冁 夔 勹 匍 訇 匐 凫 夙 兕 亠
D9F0 兖 亳 衮 袤 亵 脔 裒 禀 嬴 蠃 羸 冫 冱 冽 冼  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
DAA0   凇 冖 冢 冥 讠 讦 讧 讪 讴 讵 讷 诂 诃 诋 诏
DAB0 诎 诒 诓 诔 诖 诘 诙 诜 诟 诠 诤 诨 诩 诮 诰 诳
DAC0 诶 诹 诼 诿 谀 谂 谄 谇 谌 谏 谑 谒 谔 谕 谖 谙
DAD0 谛 谘 谝 谟 谠 谡 谥 谧 谪 谫 谮 谯 谲 谳 谵 谶
DAE0 卩 卺 阝 阢 阡 阱 阪 阽 阼 陂 陉 陔 陟 陧 陬 陲
DAF0 陴 隈 隍 隗 隰 邗 邛 邝 邙 邬 邡 邴 邳 邶 邺  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
DBA0   邸 邰 郏 郅 邾 郐 郄 郇 郓 郦 郢 郜 郗 郛 郫
DBB0 郯 郾 鄄 鄢 鄞 鄣 鄱 鄯 鄹 酃 酆 刍 奂 劢 劬 劭
DBC0 劾 哿 勐 勖 勰 叟 燮 矍 廴 凵 凼 鬯 厶 弁 畚 巯
DBD0 坌 垩 垡 塾 墼 壅 壑 圩 圬 圪 圳 圹 圮 圯 坜 圻
DBE0 坂 坩 垅 坫 垆 坼 坻 坨 坭 坶 坳 垭 垤 垌 垲 埏
DBF0 垧 垴 垓 垠 埕 埘 埚 埙 埒 垸 埴 埯 埸 埤 埝  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
DCA0   堋 堍 埽 埭 堀 堞 堙 塄 堠 塥 塬 墁 墉 墚 墀
DCB0 馨 鼙 懿 艹 艽 艿 芏 芊 芨 芄 芎 芑 芗 芙 芫 芸
DCC0 芾 芰 苈 苊 苣 芘 芷 芮 苋 苌 苁 芩 芴 芡 芪 芟
DCD0 苄 苎 芤 苡 茉 苷 苤 茏 茇 苜 苴 苒 苘 茌 苻 苓
DCE0 茑 茚 茆 茔 茕 苠 苕 茜 荑 荛 荜 茈 莒 茼 茴 茱
DCF0 莛 荞 茯 荏 荇 荃 荟 荀 茗 荠 茭 茺 茳 荦 荥  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
DDA0   荨 茛 荩 荬 荪 荭 荮 莰 荸 莳 莴 莠 莪 莓 莜
DDB0 莅 荼 莶 莩 荽 莸 荻 莘 莞 莨 莺 莼 菁 萁 菥 菘
DDC0 堇 萘 萋 菝 菽 菖 萜 萸 萑 萆 菔 菟 萏 萃 菸 菹
DDD0 菪 菅 菀 萦 菰 菡 葜 葑 葚 葙 葳 蒇 蒈 葺 蒉 葸
DDE0 萼 葆 葩 葶 蒌 蒎 萱 葭 蓁 蓍 蓐 蓦 蒽 蓓 蓊 蒿
DDF0 蒺 蓠 蒡 蒹 蒴 蒗 蓥 蓣 蔌 甍 蔸 蓰 蔹 蔟 蔺  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
DEA0   蕖 蔻 蓿 蓼 蕙 蕈 蕨 蕤 蕞 蕺 瞢 蕃 蕲 蕻 薤
DEB0 薨 薇 薏 蕹 薮 薜 薅 薹 薷 薰 藓 藁 藜 藿 蘧 蘅
DEC0 蘩 蘖 蘼 廾 弈 夼 奁 耷 奕 奚 奘 匏 尢 尥 尬 尴
DED0 扌 扪 抟 抻 拊 拚 拗 拮 挢 拶 挹 捋 捃 掭 揶 捱
DEE0 捺 掎 掴 捭 掬 掊 捩 掮 掼 揲 揸 揠 揿 揄 揞 揎
DEF0 摒 揆 掾 摅 摁 搋 搛 搠 搌 搦 搡 摞 撄 摭 撖  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
DFA0   摺 撷 撸 撙 撺 擀 擐 擗 擤 擢 攉 攥 攮 弋 忒
DFB0 甙 弑 卟 叱 叽 叩 叨 叻 吒 吖 吆 呋 呒 呓 呔 呖
DFC0 呃 吡 呗 呙 吣 吲 咂 咔 呷 呱 呤 咚 咛 咄 呶 呦
DFD0 咝 哐 咭 哂 咴 哒 咧 咦 哓 哔 呲 咣 哕 咻 咿 哌
DFE0 哙 哚 哜 咩 咪 咤 哝 哏 哞 唛 哧 唠 哽 唔 哳 唢
DFF0 唣 唏 唑 唧 唪 啧 喏 喵 啉 啭 啁 啕 唿 啐 唼  

 

GB 2312 Character Map, 0xE0A0 - 0xEFFF

  0 1 2 3 4 5 6 7 8 9 a b c d e f
E0A0   唷 啖 啵 啶 啷 唳 唰 啜 喋 嗒 喃 喱 喹 喈 喁
E0B0 喟 啾 嗖 喑 啻 嗟 喽 喾 喔 喙 嗪 嗷 嗉 嘟 嗑 嗫
E0C0 嗬 嗔 嗦 嗝 嗄 嗯 嗥 嗲 嗳 嗌 嗍 嗨 嗵 嗤 辔 嘞
E0D0 嘈 嘌 嘁 嘤 嘣 嗾 嘀 嘧 嘭 噘 嘹 噗 嘬 噍 噢 噙
E0E0 噜 噌 噔 嚆 噤 噱 噫 噻 噼 嚅 嚓 嚯 囔 囗 囝 囡
E0F0 囵 囫 囹 囿 圄 圊 圉 圜 帏 帙 帔 帑 帱 帻 帼  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E1A0   帷 幄 幔 幛 幞 幡 岌 屺 岍 岐 岖 岈 岘 岙 岑
E1B0 岚 岜 岵 岢 岽 岬 岫 岱 岣 峁 岷 峄 峒 峤 峋 峥
E1C0 崂 崃 崧 崦 崮 崤 崞 崆 崛 嵘 崾 崴 崽 嵬 嵛 嵯
E1D0 嵝 嵫 嵋 嵊 嵩 嵴 嶂 嶙 嶝 豳 嶷 巅 彳 彷 徂 徇
E1E0 徉 後 徕 徙 徜 徨 徭 徵 徼 衢 彡 犭 犰 犴 犷 犸
E1F0 狃 狁 狎 狍 狒 狨 狯 狩 狲 狴 狷 猁 狳 猃 狺  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E2A0   狻 猗 猓 猡 猊 猞 猝 猕 猢 猹 猥 猬 猸 猱 獐
E2B0 獍 獗 獠 獬 獯 獾 舛 夥 飧 夤 夂 饣 饧 饨 饩 饪
E2C0 饫 饬 饴 饷 饽 馀 馄 馇 馊 馍 馐 馑 馓 馔 馕 庀
E2D0 庑 庋 庖 庥 庠 庹 庵 庾 庳 赓 廒 廑 廛 廨 廪 膺
E2E0 忄 忉 忖 忏 怃 忮 怄 忡 忤 忾 怅 怆 忪 忭 忸 怙
E2F0 怵 怦 怛 怏 怍 怩 怫 怊 怿 怡 恸 恹 恻 恺 恂  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E3A0   恪 恽 悖 悚 悭 悝 悃 悒 悌 悛 惬 悻 悱 惝 惘
E3B0 惆 惚 悴 愠 愦 愕 愣 惴 愀 愎 愫 慊 慵 憬 憔 憧
E3C0 憷 懔 懵 忝 隳 闩 闫 闱 闳 闵 闶 闼 闾 阃 阄 阆
E3D0 阈 阊 阋 阌 阍 阏 阒 阕 阖 阗 阙 阚 丬 爿 戕 氵
E3E0 汔 汜 汊 沣 沅 沐 沔 沌 汨 汩 汴 汶 沆 沩 泐 泔
E3F0 沭 泷 泸 泱 泗 沲 泠 泖 泺 泫 泮 沱 泓 泯 泾  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E4A0   洹 洧 洌 浃 浈 洇 洄 洙 洎 洫 浍 洮 洵 洚 浏
E4B0 浒 浔 洳 涑 浯 涞 涠 浞 涓 涔 浜 浠 浼 浣 渚 淇
E4C0 淅 淞 渎 涿 淠 渑 淦 淝 淙 渖 涫 渌 涮 渫 湮 湎
E4D0 湫 溲 湟 溆 湓 湔 渲 渥 湄 滟 溱 溘 滠 漭 滢 溥
E4E0 溧 溽 溻 溷 滗 溴 滏 溏 滂 溟 潢 潆 潇 漤 漕 滹
E4F0 漯 漶 潋 潴 漪 漉 漩 澉 澍 澌 潸 潲 潼 潺 濑  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E5A0   濉 澧 澹 澶 濂 濡 濮 濞 濠 濯 瀚 瀣 瀛 瀹 瀵
E5B0 灏 灞 宀 宄 宕 宓 宥 宸 甯 骞 搴 寤 寮 褰 寰 蹇
E5C0 謇 辶 迓 迕 迥 迮 迤 迩 迦 迳 迨 逅 逄 逋 逦 逑
E5D0 逍 逖 逡 逵 逶 逭 逯 遄 遑 遒 遐 遨 遘 遢 遛 暹
E5E0 遴 遽 邂 邈 邃 邋 彐 彗 彖 彘 尻 咫 屐 屙 孱 屣
E5F0 屦 羼 弪 弩 弭 艴 弼 鬻 屮 妁 妃 妍 妩 妪 妣  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E6A0   妗 姊 妫 妞 妤 姒 妲 妯 姗 妾 娅 娆 姝 娈 姣
E6B0 姘 姹 娌 娉 娲 娴 娑 娣 娓 婀 婧 婊 婕 娼 婢 婵
E6C0 胬 媪 媛 婷 婺 媾 嫫 媲 嫒 嫔 媸 嫠 嫣 嫱 嫖 嫦
E6D0 嫘 嫜 嬉 嬗 嬖 嬲 嬷 孀 尕 尜 孚 孥 孳 孑 孓 孢
E6E0 驵 驷 驸 驺 驿 驽 骀 骁 骅 骈 骊 骐 骒 骓 骖 骘
E6F0 骛 骜 骝 骟 骠 骢 骣 骥 骧 纟 纡 纣 纥 纨 纩  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E7A0   纭 纰 纾 绀 绁 绂 绉 绋 绌 绐 绔 绗 绛 绠 绡
E7B0 绨 绫 绮 绯 绱 绲 缍 绶 绺 绻 绾 缁 缂 缃 缇 缈
E7C0 缋 缌 缏 缑 缒 缗 缙 缜 缛 缟 缡 缢 缣 缤 缥 缦
E7D0 缧 缪 缫 缬 缭 缯 缰 缱 缲 缳 缵 幺 畿 巛 甾 邕
E7E0 玎 玑 玮 玢 玟 珏 珂 珑 玷 玳 珀 珉 珈 珥 珙 顼
E7F0 琊 珩 珧 珞 玺 珲 琏 琪 瑛 琦 琥 琨 琰 琮 琬  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E8A0   琛 琚 瑁 瑜 瑗 瑕 瑙 瑷 瑭 瑾 璜 璎 璀 璁 璇
E8B0 璋 璞 璨 璩 璐 璧 瓒 璺 韪 韫 韬 杌 杓 杞 杈 杩
E8C0 枥 枇 杪 杳 枘 枧 杵 枨 枞 枭 枋 杷 杼 柰 栉 柘
E8D0 栊 柩 枰 栌 柙 枵 柚 枳 柝 栀 柃 枸 柢 栎 柁 柽
E8E0 栲 栳 桠 桡 桎 桢 桄 桤 梃 栝 桕 桦 桁 桧 桀 栾
E8F0 桊 桉 栩 梵 梏 桴 桷 梓 桫 棂 楮 棼 椟 椠 棹  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
E9A0   椤 棰 椋 椁 楗 棣 椐 楱 椹 楠 楂 楝 榄 楫 榀
E9B0 榘 楸 椴 槌 榇 榈 槎 榉 楦 楣 楹 榛 榧 榻 榫 榭
E9C0 槔 榱 槁 槊 槟 榕 槠 榍 槿 樯 槭 樗 樘 橥 槲 橄
E9D0 樾 檠 橐 橛 樵 檎 橹 樽 樨 橘 橼 檑 檐 檩 檗 檫
E9E0 猷 獒 殁 殂 殇 殄 殒 殓 殍 殚 殛 殡 殪 轫 轭 轱
E9F0 轲 轳 轵 轶 轸 轷 轹 轺 轼 轾 辁 辂 辄 辇 辋  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
EAA0   辍 辎 辏 辘 辚 軎 戋 戗 戛 戟 戢 戡 戥 戤 戬
EAB0 臧 瓯 瓴 瓿 甏 甑 甓 攴 旮 旯 旰 昊 昙 杲 昃 昕
EAC0 昀 炅 曷 昝 昴 昱 昶 昵 耆 晟 晔 晁 晏 晖 晡 晗
EAD0 晷 暄 暌 暧 暝 暾 曛 曜 曦 曩 贲 贳 贶 贻 贽 赀
EAE0 赅 赆 赈 赉 赇 赍 赕 赙 觇 觊 觋 觌 觎 觏 觐 觑
EAF0 牮 犟 牝 牦 牯 牾 牿 犄 犋 犍 犏 犒 挈 挲 掰  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
EBA0   搿 擘 耄 毪 毳 毽 毵 毹 氅 氇 氆 氍 氕 氘 氙
EBB0 氚 氡 氩 氤 氪 氲 攵 敕 敫 牍 牒 牖 爰 虢 刖 肟
EBC0 肜 肓 肼 朊 肽 肱 肫 肭 肴 肷 胧 胨 胩 胪 胛 胂
EBD0 胄 胙 胍 胗 朐 胝 胫 胱 胴 胭 脍 脎 胲 胼 朕 脒
EBE0 豚 脶 脞 脬 脘 脲 腈 腌 腓 腴 腙 腚 腱 腠 腩 腼
EBF0 腽 腭 腧 塍 媵 膈 膂 膑 滕 膣 膪 臌 朦 臊 膻  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
ECA0   臁 膦 欤 欷 欹 歃 歆 歙 飑 飒 飓 飕 飙 飚 殳
ECB0 彀 毂 觳 斐 齑 斓 於 旆 旄 旃 旌 旎 旒 旖 炀 炜
ECC0 炖 炝 炻 烀 炷 炫 炱 烨 烊 焐 焓 焖 焯 焱 煳 煜
ECD0 煨 煅 煲 煊 煸 煺 熘 熳 熵 熨 熠 燠 燔 燧 燹 爝
ECE0 爨 灬 焘 煦 熹 戾 戽 扃 扈 扉 礻 祀 祆 祉 祛 祜
ECF0 祓 祚 祢 祗 祠 祯 祧 祺 禅 禊 禚 禧 禳 忑 忐  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
EDA0   怼 恝 恚 恧 恁 恙 恣 悫 愆 愍 慝 憩 憝 懋 懑
EDB0 戆 肀 聿 沓 泶 淼 矶 矸 砀 砉 砗 砘 砑 斫 砭 砜
EDC0 砝 砹 砺 砻 砟 砼 砥 砬 砣 砩 硎 硭 硖 硗 砦 硐
EDD0 硇 硌 硪 碛 碓 碚 碇 碜 碡 碣 碲 碹 碥 磔 磙 磉
EDE0 磬 磲 礅 磴 礓 礤 礞 礴 龛 黹 黻 黼 盱 眄 眍 盹
EDF0 眇 眈 眚 眢 眙 眭 眦 眵 眸 睐 睑 睇 睃 睚 睨  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
EEA0   睢 睥 睿 瞍 睽 瞀 瞌 瞑 瞟 瞠 瞰 瞵 瞽 町 畀
EEB0 畎 畋 畈 畛 畲 畹 疃 罘 罡 罟 詈 罨 罴 罱 罹 羁
EEC0 罾 盍 盥 蠲 钅 钆 钇 钋 钊 钌 钍 钏 钐 钔 钗 钕
EED0 钚 钛 钜 钣 钤 钫 钪 钭 钬 钯 钰 钲 钴 钶 钷 钸
EEE0 钹 钺 钼 钽 钿 铄 铈 铉 铊 铋 铌 铍 铎 铐 铑 铒
EEF0 铕 铖 铗 铙 铘 铛 铞 铟 铠 铢 铤 铥 铧 铨 铪  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
EFA0   铩 铫 铮 铯 铳 铴 铵 铷 铹 铼 铽 铿 锃 锂 锆
EFB0 锇 锉 锊 锍 锎 锏 锒 锓 锔 锕 锖 锘 锛 锝 锞 锟
EFC0 锢 锪 锫 锩 锬 锱 锲 锴 锶 锷 锸 锼 锾 锿 镂 锵
EFD0 镄 镅 镆 镉 镌 镎 镏 镒 镓 镔 镖 镗 镘 镙 镛 镞
EFE0 镟 镝 镡 镢 镤 镥 镦 镧 镨 镩 镪 镫 镬 镯 镱 镲
EFF0 镳 锺 矧 矬 雉 秕 秭 秣 秫 稆 嵇 稃 稂 稞 稔  

 

GB 2312 Character Map, 0xF0A0 - 0xF7FF

  0 1 2 3 4 5 6 7 8 9 a b c d e f
F0A0   稹 稷 穑 黏 馥 穰 皈 皎 皓 皙 皤 瓞 瓠 甬 鸠
F0B0 鸢 鸨 鸩 鸪 鸫 鸬 鸲 鸱 鸶 鸸 鸷 鸹 鸺 鸾 鹁 鹂
F0C0 鹄 鹆 鹇 鹈 鹉 鹋 鹌 鹎 鹑 鹕 鹗 鹚 鹛 鹜 鹞 鹣
F0D0 鹦 鹧 鹨 鹩 鹪 鹫 鹬 鹱 鹭 鹳 疒 疔 疖 疠 疝 疬
F0E0 疣 疳 疴 疸 痄 疱 疰 痃 痂 痖 痍 痣 痨 痦 痤 痫
F0F0 痧 瘃 痱 痼 痿 瘐 瘀 瘅 瘌 瘗 瘊 瘥 瘘 瘕 瘙  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F1A0   瘛 瘼 瘢 瘠 癀 瘭 瘰 瘿 瘵 癃 瘾 瘳 癍 癞 癔
F1B0 癜 癖 癫 癯 翊 竦 穸 穹 窀 窆 窈 窕 窦 窠 窬 窨
F1C0 窭 窳 衤 衩 衲 衽 衿 袂 袢 裆 袷 袼 裉 裢 裎 裣
F1D0 裥 裱 褚 裼 裨 裾 裰 褡 褙 褓 褛 褊 褴 褫 褶 襁
F1E0 襦 襻 疋 胥 皲 皴 矜 耒 耔 耖 耜 耠 耢 耥 耦 耧
F1F0 耩 耨 耱 耋 耵 聃 聆 聍 聒 聩 聱 覃 顸 颀 颃  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F2A0   颉 颌 颍 颏 颔 颚 颛 颞 颟 颡 颢 颥 颦 虍 虔
F2B0 虬 虮 虿 虺 虼 虻 蚨 蚍 蚋 蚬 蚝 蚧 蚣 蚪 蚓 蚩
F2C0 蚶 蛄 蚵 蛎 蚰 蚺 蚱 蚯 蛉 蛏 蚴 蛩 蛱 蛲 蛭 蛳
F2D0 蛐 蜓 蛞 蛴 蛟 蛘 蛑 蜃 蜇 蛸 蜈 蜊 蜍 蜉 蜣 蜻
F2E0 蜞 蜥 蜮 蜚 蜾 蝈 蜴 蜱 蜩 蜷 蜿 螂 蜢 蝽 蝾 蝻
F2F0 蝠 蝰 蝌 蝮 螋 蝓 蝣 蝼 蝤 蝙 蝥 螓 螯 螨 蟒  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F3A0   蟆 螈 螅 螭 螗 螃 螫 蟥 螬 螵 螳 蟋 蟓 螽 蟑
F3B0 蟀 蟊 蟛 蟪 蟠 蟮 蠖 蠓 蟾 蠊 蠛 蠡 蠹 蠼 缶 罂
F3C0 罄 罅 舐 竺 竽 笈 笃 笄 笕 笊 笫 笏 筇 笸 笪 笙
F3D0 笮 笱 笠 笥 笤 笳 笾 笞 筘 筚 筅 筵 筌 筝 筠 筮
F3E0 筻 筢 筲 筱 箐 箦 箧 箸 箬 箝 箨 箅 箪 箜 箢 箫
F3F0 箴 篑 篁 篌 篝 篚 篥 篦 篪 簌 篾 篼 簏 簖 簋  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F4A0   簟 簪 簦 簸 籁 籀 臾 舁 舂 舄 臬 衄 舡 舢 舣
F4B0 舭 舯 舨 舫 舸 舻 舳 舴 舾 艄 艉 艋 艏 艚 艟 艨
F4C0 衾 袅 袈 裘 裟 襞 羝 羟 羧 羯 羰 羲 籼 敉 粑 粝
F4D0 粜 粞 粢 粲 粼 粽 糁 糇 糌 糍 糈 糅 糗 糨 艮 暨
F4E0 羿 翎 翕 翥 翡 翦 翩 翮 翳 糸 絷 綦 綮 繇 纛 麸
F4F0 麴 赳 趄 趔 趑 趱 赧 赭 豇 豉 酊 酐 酎 酏 酤  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F5A0   酢 酡 酰 酩 酯 酽 酾 酲 酴 酹 醌 醅 醐 醍 醑
F5B0 醢 醣 醪 醭 醮 醯 醵 醴 醺 豕 鹾 趸 跫 踅 蹙 蹩
F5C0 趵 趿 趼 趺 跄 跖 跗 跚 跞 跎 跏 跛 跆 跬 跷 跸
F5D0 跣 跹 跻 跤 踉 跽 踔 踝 踟 踬 踮 踣 踯 踺 蹀 踹
F5E0 踵 踽 踱 蹉 蹁 蹂 蹑 蹒 蹊 蹰 蹶 蹼 蹯 蹴 躅 躏
F5F0 躔 躐 躜 躞 豸 貂 貊 貅 貘 貔 斛 觖 觞 觚 觜  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F6A0   觥 觫 觯 訾 謦 靓 雩 雳 雯 霆 霁 霈 霏 霎 霪
F6B0 霭 霰 霾 龀 龃 龅 龆 龇 龈 龉 龊 龌 黾 鼋 鼍 隹
F6C0 隼 隽 雎 雒 瞿 雠 銎 銮 鋈 錾 鍪 鏊 鎏 鐾 鑫 鱿
F6D0 鲂 鲅 鲆 鲇 鲈 稣 鲋 鲎 鲐 鲑 鲒 鲔 鲕 鲚 鲛 鲞
F6E0 鲟 鲠 鲡 鲢 鲣 鲥 鲦 鲧 鲨 鲩 鲫 鲭 鲮 鲰 鲱 鲲
F6F0 鲳 鲴 鲵 鲶 鲷 鲺 鲻 鲼 鲽 鳄 鳅 鳆 鳇 鳊 鳋  
  0 1 2 3 4 5 6 7 8 9 a b c d e f
F7A0   鳌 鳍 鳎 鳏 鳐 鳓 鳔 鳕 鳗 鳘 鳙 鳜 鳝 鳟 鳢
F7B0 靼 鞅 鞑 鞒 鞔 鞯 鞫 鞣 鞲 鞴 骱 骰 骷 鹘 骶 骺
F7C0 骼 髁 髀 髅 髂 髋 髌 髑 魅 魃 魇 魉 魈 魍 魑 飨
F7D0 餍 餮 饕 饔 髟 髡 髦 髯 髫 髻 髭 髹 鬈 鬏 鬓 鬟
F7E0 鬣 麽 麾 縻 麂 麇 麈 麋 麒 鏖 麝 麟 黛 黜 黝 黠
F7F0 黟 黢 黩 黧 黥 黪 黯 鼢 鼬 鼯 鼹 鼷 鼽 鼾 齄  

 

 

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 사다드
,

// 테이블 생성 및 데이터 삽입

#include <afxdb.h>
#include <atlstr.h>
#include <stdio.h>

int main()
{
 CDatabase  m_db;

 CString  sDriver = L"MICROSOFT EXCEL DRIVER (*.XLS)";
 CString  sExcelFile = L"test.XLS";
 CString  sSql;

 if(m_db.IsOpen() == TRUE)
 {
  m_db.Close();
 }
 
 //테이블 생성
 sSql.Format(L"DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
  sDriver, sExcelFile, sExcelFile);
 if(m_db.OpenEx(sSql, CDatabase::noOdbcDialog))
 {
  sSql.Format(L"CREATE TABLE %s (%s, %s, %s)"
   ,_T("TEST3")
   ,_T("Seq NUMBER")
   ,_T("Name TEXT")
   ,_T("Phone TEXT")  
   );
  m_db.ExecuteSQL(sSql); 
 }

 //레코드 삽입
 sSql.Format(L"INSERT INTO %s(Seq, Name, Phone) VALUES(%d, '%s', '%s')"
  ,_T("TEST3")
  ,1
  ,_T("홍길동")
  ,_T("123-4567")
  );

 m_db.ExecuteSQL(sSql);

 if(m_db.IsOpen() == TRUE)
 {
  m_db.Close();
 }
}


// 테이블 읽어오기

#include <afxdb.h>
#include <atlstr.h>
#include <stdio.h>

int main()
{

 CDatabase  m_db;

 CString  sDriver = L"MICROSOFT EXCEL DRIVER (*.XLS)";
 CString  sExcelFile = L"test.XLS";
 CString  sSql;


 if(m_db.IsOpen() == TRUE)
 {
  m_db.Close();
 }

 sSql.Format(L"DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",
  sDriver, sExcelFile, sExcelFile);
 if(m_db.OpenEx(sSql, CDatabase::noOdbcDialog))
 {
  sSql.Format(L"SELECT * FROM %s", L"TEST3");
  CRecordset rs(&m_db);
  rs.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

  CString  sFields[20];
  int   iFieldCount  = 0;


  iFieldCount = rs.GetODBCFieldCount();
  wprintf(L"%d\n", iFieldCount);
  while(!rs.IsEOF())
  {
   for(int i=0; i< iFieldCount; i++)
   {
    //한글을 못읽어오는 문제점이 있음   
    rs.GetFieldValue((short) i, sFields[i]);
    wprintf(L"%s\n", sFields[i]);
   }

   rs.MoveNext();
  }
 }

 if(m_db.IsOpen() == TRUE)
 {
  m_db.Close();
 }
}


 

 

'Development > C/C++' 카테고리의 다른 글

Console Function - MSDN  (0) 2011.08.13
Chinese Character Codes  (0) 2011.08.13
cast 연산자  (0) 2011.08.13
c++ 추상 기초클래스  (0) 2011.08.13
Byte Order  (0) 2011.08.13
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 사다드
,

cast 연산자

Development/C/C++ 2011. 8. 13. 15:04

1. static_cast

 

C++ 언어에서 캐스트(cast) 연산은 가장 보편적으로 사용되는 연산 입니다. 그러나 이것 만큼 정확한 의미를 모르고 사용되는 연산 또한 없을 것입니다. Visual C++ 가 제공하는 캐스트는 크게 묵시적 캐스트(implicit cast)와 명시적 캐스트(explicit cast) 두 가지로 나눌 수 있습니다. 묵시적 캐스트는 문법적인 키워드가 존재하지 않습니다. 이에 반해 명시적 캐스트는 문법적인 키워드를 가지고 있는데, 여기에는 (), static_cast, const_cast, reinterpret_cast , dynamic_cast 다섯 가지가 있습니다. 이것에 대해 하나 하나 살펴 보겠습니다.

static_cast

static_cast 는 묵시적 캐스트(implicit cast)와 일차적으로 같습니다. 타입 변환이 필요한 상황에서 특별히 캐스트 연산자를 사용하지 않을 때, 컴파일러는 묵시적 캐스트를 수행 합니다.

다음 코드를 보겠습니다.

int i = 65;

char c = i;

위의 코드는 정수 i 변수의 값을 문자 타입 변수 c 에 대입 합니다. 이때 컴파일러는 묵시적 캐스트(implicit cast)를 수행합니다.

컴파일러의 의한 묵시적 캐스트(implicit cast)는 ‘허용’ 과 ‘컴파일러에 의한 값 변환’ 두 가지로 볼 수 있습니다. ‘허용’ 이라 하는 것은 컴파일러가 오류를 발생 시키는 않고 컴파일 한다는 뜻입니다.

그리고 ‘컴파일러에 의한 값 변환’ 은 값을 변환하기 위하여 컴파일러가 만들어 내는 기계어 코드를 의미 합니다. 그런데 컴파일러가 값을 변환하기 위하여 만들어 내는 기계어 코드는 당연히 컴파일 시점일 될 것입니다.

앞에서 static_cast 가 묵시적 캐스트(implicit cast)와 일차적으로 같다고 했습니다. 즉 static_cast 도 묵시적 캐스트와 같이 ‘허용’ 과 ‘컴파일러에 의한 값 변환’ 이라는 두 가지 관점이 있고, ‘컴파일러에 의한 값 변환’ 을 위하여 컴파일러가 기계어 코드를 만들어 내는 시점이 컴파일 시점 입니다.

그래서 이것을 정적 캐스트(static cast) 라고 부릅니다.

 

그럼 왜 굳이 묵시적 캐스트(implicit cast)도 있는데 정적 캐스트(static cast)를 사용할 까요?

문법적 엄격함 입니다. 프로그래머는 스스로 문법적으로 엄격하게 작성하는 것이 버그 없는 프로그램을 만들기 위해 좋습니다. 제가 야구를 좋아하는데, 묘기를 잘 부리는 야구 선수는 결코 야구를 잘하는 선수가 아닙니다. 모든 것을 쉽고, 그리고 엄격하게 플레이 하는 선수가 진짜 야구 잘하는 선수입니다.

프로그래밍도 이와 같습니다.

그래서 c = i; 보다는 c = static_cast<char>(i); 가 더 바람직합니다.

이제 묵시적 캐스트(implicit cast)와 정적 캐스트(static cast)의 ‘허용’ 관점에 대해 이야기 해 보겠습니다. ‘컴파일러에 의한 값 변환’ 을 위해 컴파일러가 기계어 코드를 생성하기전에 컴파일러는 캐스트 상황이 안전한 지에 대해 판단하고, 안전 하다면 이를 허용하게 됩니다.

 

어떤 변수가 값을 가지고 있다면 그 변수에 어떤 값이 들어 있던 그것은 항상 안전 합니다. 그러나 만약 어떤 변수가 포인터를 가지고, 그 포인터가 가리키는 메모리가 유효하지 않다면 그것은 안전하지 않습니다.

그렇기 때문에 컴파일러가 캐스트를 허용하기 위하여 안전성을 검사하는 기준은 포인터 변수에 한해서 수행합니다. 아래의 코드를 보겠습니다.

 

char c = 'A';

char* pc = &c;

int* pi = pc;

 

위의 코드에서 int* pi = pc; 는 컴파일러에 의해 허용되지 않은 문장으로 오류를 발생시킵니다. pi 가 가리키는 메모리는 실제 문자 변수이고, 만약 pi 를 이용한다면 4 byte 액세스(정수 타입이므로)가 이루어져 다운될 가능성이 있습니다.

이것을 사전에 막고자 컴파일러는 이 문장을 허용하지 않습니다. 결론적으로 묵시적 캐스트(implicit cast)와 정적 캐스트(static cast)는 포인터 타입 캐스트에 대해 동일 타입인 경우에 한하여 허용합니다.

앞에서 이야기 한 것과 같이 대부분의 경우 정적 캐스트(static cast) 와 묵시적 캐스트(implicit cast)는 대부분 동일합니다. 다른 점은 없을까요?

class CBase { public: int a; };

class CDerived : public CBase { public: int b; };

 

위와 같이 클래스가 선언 되어 있을 때, 다음 코드를 보겠습니다.

 

CDerived* pDerived = new CDerived; CBase* pBase;
pBase = pDerived;

 

위의 pBase = pDerived; 이 허용 될까요? 포인터 타입의 캐스트 이고, 두 타입(pBase 와 pDerived)이 다른 타입이므로 허용되지 않아야 하겠지만 허용됩니다.

클래스 포인터에 대해 ‘is a’ 관계가 성립 한다면 묵시적 캐스트(implicit cast)는 허용됩니다. 왜냐하면 ‘is a’ 가 성립하는 두 타입 이라면 논리적으로도 하위 클래스가 상위 타입 데이터를 최소한 포함하기 때문에 100 % 안전하기 때문입니다.

 

물론 정적 캐스트(static cast)도 똑 같습니다.

즉 pBase = static_cast<CBase*>(pDerived); 도 허용됩니다.

계속 묵시적 캐스트(implicit cast) 와 정적 캐스트(static cast)의 같은 점만을 이야기 하고 있죠?

 하나 다른 것이 있습니다.

위의 클래스 선언을 그대로 포함한 상태에서 다음 코드를 보겠습니다.

 

CBase* pBase = new CDerived; CDerived* pDerived;

pDerived = pBase;

 

위의 pDerived = pBase; 이 허용 될까요? 허용 되지 않습니다.

왜냐하면 pDerived 가 실제 가리키고 있는 것은 CBase 객체인데, 타입이 CDerived 으로 되었으므로 이를 이용하여 CDerived 전용 멤버인 b 를 액세스 함으로서 다운될 가능성을 가지고 있기 때문입니다. 그러나 이 경우 정적 캐스트(static cast)는 가능 합니다.

즉 pDerived = static_cast<CDerived*>(pBase); 는 가능 합니다.

이것 하나가 묵시적 캐스트(implicit cast) 와 정적 캐스트(static cast)의 차이점 입니다. 즉 클래스 포인터에 대해 묵시적 캐스트(implicit cast)는 ‘is a’ 관계가 성립 하는 경우만 허용하고, 정적 캐스트(static cast)는 ‘is a’ 뿐만 아니라 상속 관계만 성립한다면 항상 허용합니다.

물론 상속 관계조차 성립하지 않는다면 정적 캐스트(static cast)도 캐스트를 허용하지 않습니다. 다음에는 reinterpret_cast 와 const_cast 에 대해 살펴 보겠습니다. 오타 있으면 지적해 주시면 감사하겠습니다.

 

 

2. reinterpret_cast

 

reinterpret_cast 는 연관성이 없는 포인터 타입을 변환하기 위해서 사용 됩니다.

이것은 static_cast 와 비교해 생각해 보는 것이 이해하기 쉽습니다. 앞에서 static_cast 와 묵시적 캐스트(implicit cast)는 연관성 있는 데이터 타입에 대해서 캐스트가 가능하다고 했습니다.

즉 연관성이 없는 데이터에 대해서는 static_cast 와 묵시적 캐스트(implicit cast)를 사용할 수 없습니다.

char c = 'A';

char* pc = &c;

int* pi = pc; // int* pi = static_cast<int*>(pc); (X)

 

위 코드의 경우 int* pi = pc; 은 문법적으로 허용되지 않습니다. pc 와 pi 는 연관성이 없기 때문입니다.

그러나 이 경우 int* pi = reinterpret_cast<int*>(pc); 를 사용 한다면 캐스트(cast)가 될 것입니다. 앞의 예 외에 reinterpret_cast 는 클래스 타입에 대해 클래스가 연관 관계가 없는 경우에도 캐스트(cast)를 할 수 있습니다.

물론 이것이 캐스트(cast) 된다고 바람직 한 것이 아닙니다. 논리적으로 안전하지 않을 수 있기 때문입니다.

int* pi = reinterpret_cast<int*>(pc); 가 문법적으로 허용 된다고 하지만 pi 를 이용하여 메모리에 접근 한다면 프로그램이 다운될 수도 있기 때문입니다.

reinterpret_cast 는 C/C++ 개발자가 일반적으로 사용 했던 () 연산자를 이용한 캐스트와 대부분 같습니다. () 는 모든 경우에 강제 캐스팅을 수행 합니다.

물론 논리적으로 안전하지는 않는 경우가 있을 수 있지만,,,

 

reinterpret_cast 도 강제 캐스팅을 수행합니다.

reinterpret_cast 와 () 의 차이는 reinterpret_cast 는 포인터 타입에 대한 캐스트만 수행할 수 있다는 것과 const 타입과 volite 타입의 포인터 타입에 대해서는 캐스트를 수행할 수 없다는 것입니다.

 

int i = 65;

char c = reinterpret_cast <char>(i);

 

물론 위와 같이 코딩하실 분은 없으시겠지만 위의 코드에서 reinterpret_cast 는 허용되지 않습니다. 저의 프로그래밍 철학으로 볼 때, 저는 이 reinterpret_cast 의 사용을 권장 하지 않습니다.

저는 항상 문법적 허용과 논리적 허용이 일치해야 한다고 생각합니다. 그러나 reinterpret_cast 는 문법적 허용과 논리적 허용이 일치 하지 않는 경우도 있습니다.

물론 () 연산자를 이용한 캐스트도 마찬가지 입니다. 다음에는 dynamic_cast 와 const_cast 에 대해 살펴 보겠습니다. 오타 있으면 지적해 주시면 감사하겠습니다.

 

 

3. const_cast

 

 const_cast 는 포인터 타입과 참조형에 대해서만 사용됩니다. 그리고 동일 타입의 포인터와 참조형에 대해서만 사용됩니다.

동일 타입 외에 어떤 연관 관계 타입(is a 타입 포함)에 대해서도 허용되지 않습니다. 그렇다면 const_cast 의 사용 목적은 무엇일까요?

 

const CSample* pSample = new CSample;

CSample* pSample1 = pSample; pSample1->m = 10;

 

위의 코드에서 처럼 상수 목적으로 생성된 CSample 객체가 필요에 의해 변수 목적(pSample1->m = 10)으로 사용되어야 한다면 이것을 일단 변수 객체 포인터로 변환해야 합니다.

그러나 이 상황(CSample* pSample1 = pSample)에서 묵시적 캐스트(implicit cast)나 static_cast 또는 reinterpret_cast 를 사용한다면 컴파일러는 이를 허용하지 않을 것입니다.

이 때 사용할 수 있는 것이 const_cast 입니다.

즉 위의 코드의 경우 다음과 같이 사용해야 합니다.

 

CSample* pSample1 = const_cast<CSample*>(pSample);

 

const_cast 는 보시는 분에 따라 명시적 캐스트 연산자인 () 도 있는데, 왜 const_cast 가 필요한지 의문을 갖는 분도 있을 것입니다. 이것 역시 문법적인 엄격함 때문에 사용됩니다.

저는 사실 const_cast 사용을 권장하지 않습니다. 모든 변수는 선언 시에 목적을 가지고 선언 되어야 하는데, 만약 변수 목적으로 사용될 가능성이 있었다면 애초에 상수로 선언되어서는 안됩니다. 프로그램 버그는 목적을 가지지않고 선언된 변수나 목적에 어긋나게 사용되는 변수에 의해 발생되는 경우가 많습니다.

 

C++ 언어에서 많이 사용되지 않는 한정자 중에 volatile 타입 한정자가 있습니다. const_cast 는 volatile 타입 객체를 일반 타입 포인터나 참조형으로 변환하기 위해서도 사용됩니다.

 

volatile BOOL g_bCalc = FALSE; :

BOOL* p = const_cast<BOOL*>(&g_bCalc);

 

물론 이 경우도 저는 권장하고 싶지 않습니다.

 

 

4. dynamic_cast

 

dynamic_cast 는 상당히 능동적인 캐스트 입니다. 다른 캐스트와 달리 dynamic_cast 는 실행 중에 캐스트가 이루어 집니다. 실행 중에 캐스트의 대상이 되는 데이터를 능동적으로 판단하여 실행 코드가 캐스트를 수행합니다.

dynamic_cast 의 문법적 형식은 다음과 같습니다.

 

dynamic_cast <타입>(표현식)

 

표현식은 가상함수와 RTTI(Runtime Type Information)를 포함하는 클래스에 대한 포인터나 참조형, 혹은 객체 일 수 있습니다. 그리고 타입은 역시 가상함수와 RTTI 를 포함하는 클래스의 포인터나 참조형일 수 있습니다.

타입에 한가지 예외적으로 void* 를 명시할 수도 있습니다. 표현식과 타입의 형식만 맞다면 컴파일러는 컴파일을 허용합니다. 표현식과 타입이 연관 관계가 있던 없던 가상함수와 RTTI 를 포함하기만 하면 dynamic_cast 는 무조건 컴파일을 허용합니다. 다른 캐스트와 달리 dynamic_cast 는 컴파일러의 허용 관점 보다는 실행 시 허용관점이 더 중요합니다.

우리도 실행 시 허용에 관심을 두어야 합니다.

RTTI(Runtime Type Information)란 클래스 타입 정보를 가지고 있는 클래스(type_info) 입니다. RTTI 는 컴파일러가 내부적으로 사용하는 정보 클래스로 아래와 같이 정의 되어있습니다.

 

class type_info {

    public: virtual ~type_info();

    int operator==(const type_info& rhs) const;

    int operator!=(const type_info& rhs) const;

    int before(const type_info& rhs) const;

    const char* name() const;

    const char* raw_name() const;

    private: void *_m_data;

    char _m_d_name[1];

    type_info(const type_info& rhs);

    type_info& operator=(const type_info& rhs);

};


type_info 클래스의 _m_data 멤버 변수는 이 글을 쓰는 저도 이해하지 못하며 NULL 로 설정되어 있습니다. 다음 _m_d_name 멤버 변수는 실제 char 하나로 구성되어 있지만 클래스 이름을 가지고 있는 배열로서 type_info 가 컴파일러에 의해 만들어 질 때 클래스 이름을 문자열로 갖도록 확장되어 생성 됩니다.

RTTI(Runtime Type Information) 를 만들기 위해 우리가 해야 할 일은 /GR 컴파일 옵션을 지정 하기만 하면 됩니다.

 

 Visual C++ 6.0 같은 경우 [Project]-[Setting] 메뉴를 선택하여 [Project Settings] 대화상자를 나타낸 후, [C/C++] 탭의 [C++ Language] 카테고리 컴파일 옵션을 선택하고, [Enable Run-Time Type Information (RTTI)] 를 선택하면 됩니다. 앞의 옵션이 선택된 경우 컴파일러는 RTTI 를 컴파일 하는 모든 클래스에 대해 생성합니다.

그러나 실제 각 클래스가 RTTI 를 사용하기 위해서는 각 클래스는 최소한 하나 이상의 가상함수를 가져야 합니다. 만약 클래스가 가상함수를 하나도 가지지 않는다면 해당 클래스는 타입으로는 RTTI 를 이용할 수 있지만 객체로는 RTTI 를 이용할 수 없습니다.

우리가 지금 알아보고 있는 dynamic_cast 도 객체의 RTTI 를 이용한 동적(실행시) 캐스트 이므로 dynamic_cast 를 위해서도 해당 클래스는 최소한 하나 이상의 가상함수를 가져야 합니다. 컴파일러는 RTTI 와 객체를 연결하기 위해서 가상함수 포인터 테이블을 이용합니다. 이것은 변칙입니다.

언제부터 RTTI 가 C++ 언어에 도입 되었는지 알 수 없지만, 원래 C++ 언어의 가상함수 포인터 테이블은 순수한 가상함수에 대한 함수 포인터 배열입니다. RTTI 와 객체의 연결을 위해 C++ 언어는 가상함수 포인터 테이블 앞에 4 byte 를 만들고 이것을 RTTI 와의 연결 고리로 사용하고 있습니다.

class CBase {

public: int m_base;

virtual void fun1 (void);

virtual void fun2 (void);

};

 

void CBase::fun1 (void) {

cout << "Base fun1" << endl;

}

 

void CBase::fun2 (void) {

cout << "Base fun2" << endl;

}

 

class CDerived : public CBase {

 public: int m_derived; virtual void fun3 (void);

};

 

int main(int argc, char* argv[]) {

CBase* p1 = new CBase;

CDerived* p2 = new CDerived;

CDerived* p3 = dynamic_cast<CDerived*>(p1);

CBase* p4 = dynamic_cast<CBase*>(p2);

return 0;

}

 

RTTI 가 생성된 경우 객체와 가상함수 포인터 테이블 모양이 조금 복잡해 집니다.

객체(p1, p2)는 여전히 가상함수 포인터 테이블을 가리키고 있지만 가상함수 포인터 테이블 앞에 숨겨진 4 byte 가 컴파일러에 의해 추가로 만들어 집니다.

그리고 바로 이 숨겨진 4 byte 가 클래스의 RTTI 포인터 테이블과 객체의 연결 고리로 사용됩니다.

 

RTTI 포인터 테이블은 객체 자신의 RTTI 나 상위 클래스의 RTTI 를 가리키는 또 다른 연결 고리입니다. 여러 단계에 걸쳐 상속된 경우 실제 모양은 위의 그림보다 복잡해 집니다. 위의 그림은 원리를 설명하기 위하여 간단히 그려본 것입니다.

프로그램이 dynamic_cast 를 이용하여 캐스트를 한 경우 실행 코드는 dynamic_cast 의 표현식에 기술된 객체를 이용하여 RTTI 포인터 테이블을 검색하고, 만약 RTTI 포인터 테이블 상에 일치하는 RTTI 가 존재 한다면 표현식에 기술된 객체의 타입을 변환하여 반환하고, RTTI 포인터 테이블 상에 일치하는 RTTI 가 존재 하지 않는다면 dynamic_cast 는 NULL(0) 을 반환할 것 입니다.

앞의 코드의 경우 p3 는 NULL 을 반환하고 p4 는 유효한 값을 반환할 것입니다.

이와 같이 dynamic_cast 는 다른 캐스트와 달리 표현식의 실제 객체를 추적하여 캐스트를 수행하므로 상당히 능동적이 캐스트라 할 수 있습니다. 잘 설계된 클래스를 바탕으로 어플리케이션이 개발 될 때 어플리케이션 상의 클래스 포인터 타입은 대부분 상위의 몇 가지 타입으로 운영됩니다. 그러나 간혹 실제 객체의 클래스 타입에 따라 어떤 논리를 처리해야 하는 경우가 생기는데, 이때 우리는 dynamic_cast 를 다음과 같이 이용할 수 있습니다.

 

if (dynamic_cast<CDerived*>(p)) { : : }

 

위의 if 블록은 p 가 CDerived 타입 인 경우만 수행될 것입니다. dynamic_cast 만큼 일반적이지는 않지만 RTTI 가 사용되는 경우가 한가지 더 있습니다.

바로 typeid 연산자가 바로 그것입니다. typeid(표현식) typeid 는 표현식이 RTTI 를 가지고 있다면 그것의 RTTI 클래스(type_info) 참조형을 반환합니다. RTTI 클래스(type_info) 참조형을 이용하여 클래스 이름이나 비교를 수행할 수 있습니다.

 typeid 를 사용할 때 주의할 것은 클래스 포인터가 전달된 경우 클래스 포인터 타입에 대해 별도의 RTTI 클래스 참조형이 반환된다는 것이다.

 

int main(int argc, char* argv[]) {

CBase* p1 = new CBase;

CDerived* p2 = new CDerived;

const type_info& t = typeid (p1);

const type_info& t1= typeid(*p1);

return 0;

}

 

위의 typeid(p1) 과 typeid(*p1) 은 서로 다른 type_info 가 반환됩니다. typeid(*p1) 은 dynamic_cast 와 같이 p1 객체를 추적하여 RTTI 를 알아내고 그것의 type_info 참조형으로 반환합니다. 그러나 typeid(p1) 은 p1 포인터 타입(CBase*)에 대해 RTTI 가 반환됩니다.

이때 반환되는 RTTI 는 객체와 어떠한 연결 고리도 가지지 않는 RTTI 입니다.

 

 

 

'Development > C/C++' 카테고리의 다른 글

Chinese Character Codes  (0) 2011.08.13
CDatabase 을 사용한 엑셀 데이터 수정  (0) 2011.08.13
c++ 추상 기초클래스  (0) 2011.08.13
Byte Order  (0) 2011.08.13
ASCII Code Table  (0) 2011.08.13
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 사다드
,

c++에서 아주 중요한 class에 대해서 공부하고 있군요..
질문자는 class가 내부적으로 어떻게 돌아가는지 잘 모르시는 것 같습니다..
사실 c++이라는게 워낙에 프로그래머가 모르는 일을 많이 해서 직관적으로 다가오지 않는게
사실입니다..
저 역시 class를 공부했을때 질문자처럼 답답함을 느꼈죠..
이 내용은 저에게 많은 가르침을 주셨던 분에게 배웠던 내용입니다..
어설프게 설명하여 그 분의 이름에 먹칠이나 하지 않을까 걱정이지만 그래도 설명을 해보겠습니다..^^
(이해를 못했다면 제가 부족한탓임..^^;;)

 

흔희들 c++를 객체지향 c언어를 절차적 언어라고 하는데요..
아이러니하게도 c++의 클래스는 c언어로 표현할 때 직관적으로 이해할 수 있습니다..
(질문자가 c언어를 모를수도 있기때문에 쉽게 구조체로 표현한다고 생각하세요..
 또한 printf를 모를수도 있기때문에 cout으로 표현하겠습니다..)

 

1.생성자와 소멸자..
아래는 클래스로 표현한 간단한 생성자와 소멸자 예제입니다..

 

class CTest
{
public:
 CTest()
 {
  cout << "생성자" << endl;
 }
 ~CTest()
 {
  cout << "소멸자" << endl;
 }
 
 int i;
};

void main()
{
 CTest *test;

 test = new CTest;

 delete test;
}

 

출력내용은 "생성자" "소멸자" 입니다..
위의 예제로 보면 new를 할때 생성자가 호출되고 delete를 할 때 소멸자가 호출된다는것은 알겠지만
직관적이지 못합니다..
저 내용을 c언어로 표현하면 아래와 같습니다..

 

//*
typedef struct CTest
{
 int i;
}CTest; //*/

 

void CTest_Init(CTest* test)
{
 cout << "생성자" << endl;
}
void CTest_Clear(CTest* test)
{
 cout << "소멸자" << endl;
}

 

void main()
{
 CTest *test;

 test = (CTest*)malloc(sizeof(CTest));
 CTest_Init(test);

 CTest_Clear(test);
 free(test);

 getch();
}

 

보시면 알겠지만 c언어로 표현을 하니까 생성자와 소멸자가 무엇인지 직관적으로 보입니다..
c++에서 new를 한다는것은 malloc 후에 생성자 함수를 호출하는것이고 delete를 한다는것은
소멸자함수를 호출한후에 free를 한다는것을 알 수 있습니다..
new,delete와 c언어와의 관계를 보기쉽게 아래와같이 표현했습니다..

new  ==  malloc() -> Init();호출
delete == Clear();호출 -> free()

즉 c++에서의 객체생성은 저와같은 과정을 생략하고 있었던 것입니다..


2. 상속
아래는 클래스를 이용한 간단한 상속 예제입니다..

 

class A
{
public:
 A()
 {
  cout << "어미 생성됐다.." << endl;
 }
 ~A()
 {
  cout << "어미 소멸됐다.." << endl;
 }
 
 int i;
};

 

 

class B : public A
{
public:
 B()
 {
  cout << "자식 생성됐다.." << endl;
 }
 ~B()
 {
  cout << "자식 소멸됐다.." << endl;
 }

 char j;
};


void main()
{
 B *b;

 b = new B;
 delete b;

 getch();
}


실행을 해보면 생성자와 소멸자의 호출순서가 흥미롭습니다..
어미->자식->자식->어미 이런식으로 생성자와 소멸자가 호출됨을 알 수 있습니다..
하지만 이러한 내용은 new와 delete에서 내부적으로 지가 알아서 해버리기때문에
프로그래머한테 직관적으로 다가오지 않습니다..
c언어로 표현을 해보죠..


typedef struct A
{
 int i;
}A;

 

void A_Init(A* a)
{
 cout << "어미 생성" << endl;
}
void A_Clear(A* a)
{
 cout << "어미 소멸" << endl;
}

 

 

typedef struct B
{
 A parent;        // 이게 상속의 정체다..
 char j;
}B;

 

void B_Init(B* b)
{
 cout << "자식 생성" << endl;
}
void B_Clear(B* b)
{
 cout << "자식 소멸" << endl;
}

 

void main()
{
 B *b;

 b = (B*)malloc(sizeof(B));
 
A_Init(&b->parent);
 B_Init(b);


 B_Clear(b);
 A_Clear(&b->parent);
 free(b);

 getch();
}


B구조체에서 상속을 어떻게 표현했는지 잘 보세요..
바로 A객체를 포함함으로써 상속이 표현됐음을 알 수 있습니다.. 이게 바로 c++에서 상속의 정체죠..
또한 B객체를 생성했을때 생성자와 소멸자의 호출 역시 c언어에서 더욱더 직관적으로 알 수
있게 되었습니다..
상속된 객체를 new나 delete를 했을경우 c++내부에서는 아래와같이 진행이 된다는 것이죠..

 

new == malloc() -> 어미생성자함수호출 -> 자식생성자함수호출
delete ==  자식소멸자함수호출 -> 어미소멸자함수호출 -> free()

 

자 여기에서 질문자의 마지막 질문의 의문이 풀렸습니다..

 

class A
class B :public A 일때

A *a = new B;

 

당연히 되겠죠?? B구조체에서 봤던것처럼 B는 내부적으로 낮은주소에 A객체를 포함하고 있기때문에
A포인터형으로 B를 가리키게 된다고 해도 유효한 영역이므로 가능한것입니다..

 

A포인터 -->  [A]|j
B포인터 -->  [A]|j

 

둘다 상관없다는 말입니다.. 그런데 아래와같이 B구조체를 만들었다고해봅시다..

 

tyepdef struct B
{
   char j;
   A parent;
}

 

이건 상속이 아니고 위임입니다.. 상속은 항상 상속의 대상이되는 객체가 구조체의 맨위에 위치해야합니다.

 

A포인터 -->  j|[A]
B포인터 -->  j|[A]

 

위와같이 A포인터가 j영역을 가리키고있기때문에 성립이 안되는거죠..
이제 확실히 상속이 무엇인지 알겠죠??


3. 다중상속의 사기성..
A,B,C클래스가 있고 C클래스가 A,B를 상속받았다고 합시다..
그런데 이것을 구조체로 표현하면 아래와 같을것입니다..

 

tyepdef struct C
{
   A parent1;
   B parent2;
   .
   .
   .
}C;

 

메모리 배치는 아래와같이 되겠죠..


[A][B]...

 

그런데 이상하죠..?? 분명 C는 A,B를 둘다 상속했으므로 A,B포인터로 다 표현가능해야합니다..
그런데 c언어에서 보니까 아래와같은 문제가 생기게됩니다..

 

A포인터 --> [A][B]...
B포인터 --> [A][B]...

 

A포인터로 C를 가리키면 문제가 안되지만 B포인터로 C를 가리키면 문제가됩니다..
왜냐하면 B포인터는 B영역이 아닌 A영역을 가리킬테니까여..
그래서 c++에서는 프로그래머가 예상치못한 과부하가 걸리는 어떤 조작을 내부적으로 해버립니다..
아래와같이 말이죠..

 

A포인터 --> [A][B];
B포인터 --> c++내부조작 --> [B][A];

 

c++을 처음공부하는 프로그래머라면은 이런현상을 알 수 없습니다..
왜냐하면 내부적으로 프로그래머 모르게 처리해버리니까요..
즉 어설프게 c++를 했다가는 끊임없이 프로그래머를 속이는 컴파일러에 당할수 밖에 없다는 거죠..

다른예를 들어보도록하죠.. 다이아몬드형태의 상속도 문제가 됩니다..
아래와같은 상속이 있다고 해보죠..

 

A <--  B   <--
  <--  C   <-- D

 

위의 상속계통도는 B와 C는 A를 상속받았고 D는 다시 B,C 모두에게 다중상속을 받았습니다..
그러면 이것을 c언어로 표현한다면 아래와같이 되겠죠..

 

struct B
{
   A parent;
   int b
};

struct C
{
   A parent;
   int c
};

struct D
{
   B parent1;
   C parent2;
   int d
};

 

왜 이것이 문제가 될까요?? 이것을 메모리배치로 표현을 하면 아래와 같습니다..

 

D포인터  -->  [[A][b]] [[A][c]] [d]

 

앞에A는 B의 A이고 뒤에 A는 C의 A입니다.. 그런데 만약 상속받은 A객체의 멤버에 접근한다면
어느 A멤버에 접근해야 하죠?? 앞에 A?? 뒤에 A??
이건 큰 문제죠.. 그래서 저런 다이아몬드 상속의 문제점을 해결하기 위해 c++에서는 상속에 virtual 키워드를
사용하게 만들어놓았습니다.. 아래와같이 말이죠..

 

class B : virtual public A
{
};

class C : virtual public A
{
};

class D : public B, public C
{
};

 

아무리 virtual키워드를 사용하여 상속을 한다고 하지만 c++이 내부적으로 과부하를 일으킨다는것은
너무도 뻔합니다..
결과적으로 다중상속은 "별로좋지않다" 라는것입니다.. 다중상속을 많이 할 수록 문제점은 기하급수적으로 늘어만 가죠..
때문에 자바와 c#에서는 문제가 많은 다중상속을 지원하지 않습니다..
대신 인터페이스라는 개념을 도입하여 다중상속의 문제점을 해결하고 있죠..(인터페이스는 c++에서 안나오므로 설명생략..)
하지만 c++에서는 그러한 개념이 없기때문에 조심해서 다중상속을 사용하면 됩니다.. ㅡㅡ;

 

4. 가상함수..
이제 질문자가 궁금해하고 있는 가상함수부분에 대해서 설명하도록 하죠..
아래는 간단한 가상함수의 예입니다..

class A
{
public:
 A()
 {
  i = 100;
 }
 ~A()
 {
 }

 virtual void Print()
 {
  cout << i << endl;
 }

 int i;
};

 

 

class B : public A
{
public:
 B()
 {
  ch = 'a';
 }
 ~B()
 {
 }

 virtual void Print()
 {
  cout << ch << endl;
 }

 char ch;
};

 

 

void main()
{
 A *a = new A;
 A *b = new B;

 a->Print();
 b->Print();

 delete a;
 delete b;

 getch();
}

 

실행해보면 알겠지만 a->Print()와 b->Print()는 서로 다른 메소드입니다..
도대체 virtual이 뭐길래 실행도중에 저렇게 Print가 바뀌는것일까요???
c언어로 가상함수를 구현해보면 쉽게 알 수 있습니다..
c언어에서는 함수포인터를 사용하여 가상함수를 구현합니다..
위의 예제를 c언어로 구현해보면 아래와같습니다..


struct A;
typedef void (*Print)(A* a);        // 함수포인터..

 

 

 

typedef struct A
{
 Print print;
 int i;
}A;

 

void A_Init(A* a)
{
 a->i = 100;
}
void A_Clear(A* a)
{
}
void A_Print(A* a)
{
 cout << a->i << endl;
}

 

 


typedef struct B
{
 A parent;
 char ch;
}B;

 

void B_Init(B* a)
{
 a->ch = 'a';
}
void B_Clear(B* a)
{
}
void B_Print(A* a)
{
 cout << ((B*)a)->ch << endl;
}

 

 

void main()
{
 A *a,*b;

 

 a = (A*) malloc (sizeof(A));
 a->print = A_Print;           // 이것이 가상함수의 정체다..
 A_Init(a);

 

 b = (A*) malloc (sizeof(B));
 b->print = B_Print;           // 가상함수세팅..
 A_Init(a);                    // 상속받았으므로 부모부터 생성자호출..
 B_Init((B*)b);               
// 자식생성자 호출..

 

 a->print(a);
 b->print((A*)b);

 

 B_Clear((B*)b);
 A_Clear(a);
 free(b);

 

 A_Clear(a);
 free(a);

 getch();
}

결과는 클래스로 구현했을때와 같습니다.. 즉 각각의 함수는 메모리가 할당되는 순간
배치되어 실시간적으로 Print메소드가 서로 다르게 구현되었던 것이었습니다..
c++에서는 가상함수테이블이 라는것이 있어서 A_Print,B_Print의 함수포인터를 테이블에 저장해놓습니다..
그리고 클래스의 메모리가 생성될때 함수포인터를 테이블에서 읽어와 위에처럼 세팅하죠..
new 를 사용하다보면 뒤에 클래스명 적어주죠?? 바로 그 클래스명을 해쉬코드값으로 하여 해당 테이블을 찾아
함수포인터를 세팅하는것입니다..
아래와 같이 말이죠..

 

new == malloc실행 -> 구조체명을 해쉬코드로 하여 함수포인터를 얻어와세팅  -> 부모생성자함수호출 -> 자식생성자함수호출
delete == 자식소멸자함수호출 -> 부모소멸자함수호출 -> free실행

 

c++에서는 위의 과정이 new명령어의 내부적으로 실행되기때문에 프로그래머는 알 수 없습니다..
그러고보면 new나 delete가 상당히 많은 일을 합니다..^^

 

5. 순수가상함수..
위의 예제에서 A클래스가 아래와 같이 추상클래스라고 해봅시다..


class A
{
public:
 A()
 {
 }
 ~A()
 {
 }

 virtual void Print() = 0;        // 순수가상함수..
};

 

이때 A를 new로 메모리생성하게 되면 함수포인터를 얻어와 세팅되는 부분이 생략됩니다..
c언어 입장에서 보면 malloc 후에 a->print = NULL; 로 세팅한다는 얘기죠..
때문에 a->print(a); 를 실행할 수가 없습니다.. (NULL은 실행못하니까여..)

 

typedef struct A
{
 Print print;
}A;

 

위와같이 Print 의 포인터함수 선언만 있을뿐 실제로 print에 아무런 할당을 안하기때문에
추상클래스는 인스턴스를 생성할 수 없는것입니다..
물론 A_Print함수도 만들필요가 없기때문에 가상함수테이블에 저장되지도 않겠죠..

 


위의 5가지만 알아도 클래스에 대해서 많은 부분을 안것입니다..
c언어로 클래스를 표현하면 클래스의 여러가지 개념에 대해 쉽게 알수 있다는사실을 알았을것입니다..
때문에 c++을 먼저공부하는것보다는 c언어 공부후 c++를 하라고 권장하는것입니다..
c언어와 c++의 차이는 불편함과 편리함의 차이지 c언어 역시 객체지향적으로 얼마든지 표현 가능하거든요..

 

클래스에 대해서 자신감이 붙었다면 디자인패턴에 대해서 공부하세요.. 디자인패턴은 클래스설계에 관한 내용이거든요..
디자인패턴을 공부해야 비로소 클래스의 진가를 알게 됩니다..

 

출처 : 네이버 지식인

http://kin.naver.com/browse/db_detail.php?d1id=1&dir_id=10104&eid=GN9zYf%2F9tkD3UgcTC2aRj4z3LGiyQnB6

'Development > C/C++' 카테고리의 다른 글

CDatabase 을 사용한 엑셀 데이터 수정  (0) 2011.08.13
cast 연산자  (0) 2011.08.13
Byte Order  (0) 2011.08.13
ASCII Code Table  (0) 2011.08.13
ACE 란 무엇인가?  (0) 2011.08.13
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 사다드
,